关于signed和unsigned进行整形提升所出现的问题

本文解析了字符变量a、signed char b和unsigned char c为何在输出为-1时有不同的表现,涉及补码存储、整形提升及原码输出规则。重点讲解了有符号和无符号字符在内存中的存储和打印差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看如下代码:

int main() {
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);
	return 0;
}

输出结果如下图所示
在这里插入图片描述为什么会出现这种结果呢,现在我来分析一下
内存中存储这些变量都是以补码的方式进行存储,所以a、b、c在内存中的存储都是11111111这样的形势进行存储

int main() {
	char a = -1;
	//11111111
	//有符号的char第一位是符号位,
	//在进行以%d进行打印的时候,会发生整形提升
	
	//进行整形提升之后
	//11111111111111111111111111111111    补码
	//打印的时候以原码的形式进行输出
	//10000000000000000000000000000001    原码
	//所以有符号的char输出的结果是1
	//signed char 和char的结果分析是一样的,就不做分析
	
	signed char b = -1;
	//11111111
	unsigned char c = -1;
	//11111111   补码
	//在进行%d进行打印的时候会进行整形提升
	//无符号的char进行整形提升的时候,第一位不做符号位
	
	//进行整形提升之后变成
	//00000000000000000000000011111111   补码
	//正数的原码反码补码相同
	//所以无符号位输出的结果是255
	printf("a=%d,b=%d,c=%d", a, b, c);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值