让你秒懂对char和unsigned char 以%d或%u形式打印的核心

左图无符号unsigned char的数值图,可知,是由0~255。

右图是有符号char(char和 signed cahr)的数值图,可知是由 -128~127。

右图的1000 0001为-127 是因为1000 0001是有符号char的补码,其转换原码(-1成为反码,符号位不变取反成为原码)为1111 1111 第一个1为符号位代表为负数 后面7个1为127 所以值为-127 

而1000 0000 为-128 这是规定 记住就行

截断:

将一个整数存储到char里面,由于char是一个字节大小,对于四个字节大小的整数,会发生截断,只保留补码的最后8位。

整形提升:

意义在于将截断后的8位补充到32位,

规则(如何提升):对char和signed char(有符号char)这种有符号位的采用左补24个符号位(根据截断后的8个比特位的符号位来作为左补,如截断后的符号位为1,则左补24个1 反之补0)。

对unsigned char 这种无符号位的采用直接左补24个0。

整形提升后的打印;

一:%u

%u是以无符号的形式打印整数,所以,我们整形提升后得到的32位补码直接可以作为原码 ,再打印出结果。

二:%d

%d是以有符号的形式打印整数,所以,我们整形提升后得到的32位补码,要先观察32的第一位,如果是1,则是负数,需要将这32位补码转化为原码(-1得到反码,再符号位不变按位取反得到原码);如果是0,则是正数,原返补码相同,直接打印即可。

重点:整形提升需要注意char是否有无符号,但是提升完毕后,不管是%d,还是%u打印,都不需要在考虑char是否有无符号,而是要站在%d和%u的角度去考虑整形提升后的32位是直接打印(%u),还是要从补码换成原码(%d)。

题目讲解:

1.

首先abc截断后的8位都是一样的(1111 1111),其次a,b都是有符号char,所以a,b的整形提升后的32位一样(1111 1111 1111 1111 1111 1111 1111 1111 ),又都是按照%d打印,32位要转化成原码,符号位为1,所以为负数,原码为 (1000 0000 0000 0000 0000 0000 0000 0001),结果就是-1。
对于c, 截断后的8位都是一样的(1111 1111),整形提升无符号char,所以左补24个0,此时32 位为(0000 0000 0000 0000 0000 0000 1111 1111),要以%d打印,第一位为0,所以是正数,原反补相同,直接作为原码打印,255。
2.

a截断后为(1000 0000),整形提升,有符号char左补符号位,所以为11111111 11111111 11111111 10000000,又以%u打印,所以,直接补码打印即可。

3.

从9~0很简单,当-1的时候,补码全为1,而%u是以无符号整数直接打印,所以补码直接打印,所以结果为4294967168,然后再逐渐递减1。
4.

要点:char的范围在-128~127
a【i】一开始为-1-i 即a[0]=-1
所以从-1递减开始1(-1,-2,-3)到-128,然后由下图可知会从127到0,总的来说,从-1~-128,然后从127~0,而strlen的判断条件是‘\0’,‘\0’的ascll码值就是0,所以在a【i】=0的时候,会停止,总计在0之前有255个数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值