面对无符号类型,%d与%u的区别

1,原码变成反码是取反(除符号为外,将原来的0或1变为1或0),反码变为补码是加1

例如 

10000011000000000011000000000011 原码
11111100111111111100111111111100 反码
11111100111111111100111111111101 补码

2,面对无符号类型,%d与%u

例1:

当使用%u打印无符号的c时,c看为正数,最高位不是符号,当做有效数字 

虽然打印的都是变量的c,但当时用%d时,会将c看作有符号的c,即最高位是符号位,认为是负数,所以此时的补码不是原码,要将其转化为原码,在打印出来,结果会为-10

int main()
{
	int a = -20;
	//10000000000000000000000000010100 原码
	//11111111111111111111111111101011 反码
	//11111111111111111111111111101100 补码
	unsigned int b = 10;
	//00000000000000000000000000001010 原码 补码
	unsigned int c = a + b;
	//11111111111111111111111111101100 a
	//00000000000000000000000000001010 b
	//11111111111111111111111111110110 a+b
	//11111111111111111111111111110110 c
	printf("%d\n", c); //结果为-10
	printf("%u\n", c); //结果为4294967286
	return 0;
}

 

例题2

int main()
{
	int a = -1;
	//10000000000000000000000000000001
	//11111111111111111111111111111110
	//11111111111111111111111111111111
	unsigned short b = a;
	//1111111111111111 b的原反补
	printf("%d\n", b);
	//00000000000000000111111111111111 整形提升,因为b是无符号短整型类型的,所以补0
	printf("%u\n", b);
	//00000000000000000111111111111111 整形提升,因为b是无符号短整型类型的,所以补0
	return 0;

这里的b最高位都是0,所以用%d时会把他看成正数,所以用%d与%u打印出来的结果都一样 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值