今日错题(7.11)

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

输出的是多少?

答案是-1,-1,255

解析:

int main()
{
	char a = -1;
	//-1的原码:10000000 00000000 00000000 00000001
	//char类型导致裁剪后的原码: 00000001
	//补码:11111111
	//由于要打印出的%d是int类型,所以需要整形提升(符号位是1):11111111 11111111 11111111 11111111
	//打印出的原码:10000000 00000000 00000000 00000001->为-1
	signed char b = -1;
	//同上,因为类型默认为signed
	unsigned char c = -1;
	//补码:11111111
	//整形提升(无符号,以0补上):00000000 00000000 00000000 11111111
	//打印出的原码(正数与补码相同):00000000 00000000 00000000 11111111—>256
	printf("%d,%d,%d", a, b, c);
	return 0;
}

总结:

1.要先将-1的二进制写出再放入char中,而不是直接用char打出-1的二进制

  10000000 00000000 00000000 00000001(-1的原码)------->00000001(放入char)         (√)

  10000001(直接在char中放入-1)                                                                                        (×)

2.原反补码的应用:存储补码,打印原码

  原码-反码-补码-剪切

3.有符号与无符号的整形提升

拓展

若改为printf("%u",a,b,c),答案是多少?

答:a=2的33次方-1

       b=2的33次方-1

       c=256

解析:

1.%u是指打印出无符号的整数,因此在整形提升过后,不需要转为原码了,无符号原反补码相同

2.整形提升是按照自身类型的有无符号来进行的,不是说打印%u类型就是按照无符号进行整形提升

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值