麻了,麻了,这谁看不迷糊。 (温馨提示:出题时程序一般不会将每一种情况列出,会选其中一个或多个;请勿以答案相同认为思路相同)
见了这种题怎么办?
猜?这多少分之一的概率?
死记?它变个数字又不同了,那得记多少?
放弃?好像只能这样了。(不行,不行)
今天,博主来教你们彻底解决这些问题。
众所周知整数有三种存储形式:原码、反码、补码,在内存中为补码。 (若不清楚原码、反码、补码或不明白进制转换,建议先对其进行学习)
128的原、反、补码相同为:(8位二进制一组便于观察,整体为4字节整型)
00000000 00000000 00000000 10000000
以char形式(包括unsigned char,大小均为一字节)存储入内存中为:10000000。其中unsigned char形式无符号位以%d形式输出,先以无符号形式整型提升(全补0)变为:
00000000 00000000 00000000 10000000
再以整型(有符号位、十进制)输出即128。以%u形式输出,加粗部分不变,以无符号整型输出(最高位不作符号位而为数值),仍为128
其中char形式有符号位以%d形式输出,先以有符号形式整型提升(全补符号位(符号位为二进制最高位))变为:
11111111 11111111 11111111 10000000
再以整型(有符号位、十进制)输出,因其符号位为1是负数原、反、补码不同,化为原码变为
10000000 00000000 00000000 10000000十进制为-128。以%u形式输出,加粗部分不变,以无符号整型输出(最高位不作符号位而为数值),为4294967168。
-128的原、反、补码不同,先用原码推至补码
10000000 00000000 00000000 10000000 --原码
11111111 11111111 11111111 01111111 --反码(原码符号位不变,其它位取反)
11111111 11111111 11111111 10000000 --补码(反码加1)
以char形式(包括unsigned char,大小均为一字节)存储入内存中为:10000000。
其中unsigned char形式无符号位以%d形式输出,先以无符号形式整型提升(全补0)变为:
00000000 00000000 00000000 10000000
再以整型(有符号位、十进制)输出即128。以%u形式输出,加粗部分不变,以无符号整型输出(最高位不作符号位而为数值),仍为128
其中char形式有符号位以%d形式输出,先以有符号形式整型提升(全补符号位(符号位为二进制最高位))变为:
11111111 11111111 11111111 10000000
再以整型(有符号位、十进制)输出,因其符号位为1是负数原、反、补码不同,化为原码变为
10000000 00000000 00000000 10000000十进制为-128。以%u形式输出,加粗部分不变,以无符号整型输出(最高位不作符号位而为数值),为4294967168。
注重点:整型提升不以输出时的有无符号位决定而以创建时的有无符号位决定。
如此看来,这也不难,明其道理可举一反三,所以学习虽不易,但请勿放弃。
如果这篇文章对你有帮助请点个关注和赞。
标签:11111111,输出,10000000,入门,符号,00000000,为啥,整型,放弃 From: https://blog.csdn.net/gybhh/article/details/140669608