1.第一题
首先,-1是个整数,所以我们先写出它的二进制的原码、反码、补码:
原码:10000000 00000000 00000000 00000001
反码:11111111 11111111 11111111 11111110
补码:11111111 11111111 11111111 11111111
接着,我们看要把它放到 char 类型的 a 里面,把4个字节放进一个字节,要发生截断,所以将后8位放入 a 中;
char a : 11111111 ;b 和 c 也是一样,
接着我们以整型打印,要发生整形提升:整型提升是根据你自身的符号位提升,所以 a 和 b 提升成:
补码:11111111 11111111 11111111 11111111 (vs中 ,char 和signed char 本质相同)
接着再-1再取反得到原码:
原码:10000000 00000000 00000000 00000001
最后打印出来的就是-1;
对于 c 来说,没有符号位这个说法,因为是unsigned char ,所以直接补0;c 提升成:
00000000 00000000 00000000 11111111
打印整形的时候,因为最高位是0,所以原码=反码=补码,所以打印 255;
2.第二题
首先,看到-128是整数,所以写出它的二进制:
原码:10000000 00000000 00000000 10000000
反码:11111111 11111111 11111111 01111111
补码:11111111 11111111 11111111 10000000
再截断:10000000;要求以无符号整型的形式打印,所以要整型提升:
补码:11111111 11111111 11111111 100000000
又因为正数的原码、反码、补码都相同,所以结果就是 4294967168;
3.第三题
首先我们将128的原反补码写出来(正数的原反补相同):
00000000 00000000 00000000 100000000
存到char 类型中去再截断:10000000
因为打印无符号整型,所以整型提升:
11111111 11111111 11111111 10000000
因为无符号,所以直接看作原码,得到:4294967168;
4.第四题
写出 i 和 j 的原码、反码、补码:
i :
10000000 00000000 00000000 00010100
11111111 11111111 11111111 11101011
11111111 11111111 11111111 11101100
j :
00000000 00000000 00000000 00001010
i+j:补码相加
11111111 11111111 11111111 11110110
再-1:
11111111 11111111 11111111 11110101
再取反:
10000000 00000000 00000000 00001010
也就是:-10
5.第五题
i 是无符号整型,可以说 i>=0 恒成立:
9:00000000 00000000 00000000 00001001
8:00000000 00000000 00000000 00001000
7:00000000 00000000 00000000 00000111
……
1:00000000 00000000 00000000 00000001
0:00000000 00000000 00000000 00000000
4294967295:11111111 11111111 11111111 11111111
4294967294:11111111 11111111 11111111 11111110
……
0:00000000 00000000 00000000 00000000
4294967295:11111111 11111111 11111111 11111111
……(死循环)
6.第六题
( char 属于整数类型,是可以存数字的,但是负数不会被解释成ASCII码,这里为了方便一点正数就不写ASCII码了)
i=0 ; a[0]=-1-0=-1 ; 原码:10000001
i=1 ; a[1]=-1-1=-2 ; 原码:10000010
i=2 ;a[2]=-1-2=-3; 原码:10000011
……
i=127;a[127]=-1-127=-128 ; 原码:10000000
i=128;a[128]=-1-128=127 ; 原码:01111111
i=129;a[129]=-1-129=126; 原码:01111110
……
i=253;a[253]=-1-253=2 ; 原码:00000010
i=254;a[254]=-1-254=1 ; 原码:00000001
i=255 ; a[255]=-1-255=0 ; 原码:00000000
因为字符串遇到'\0'截止,所以i=254,所以 strlen(a) =255 ;
如果我变式:a[i]=-2-i ; 结果就是254;
因为char a[1000] 就是 -1-128127~0的循环,直到遇到'\0'结束;
7.第七题
首先看到 i 的类型:unsigned char ; 可以知道 i 的范围在0到255之间;
再看到for循环的判断条件,发现条件恒成立 : 死循环打印hello world ;
通过这些题目,希望大家可以更加了解数据的存储的知识点,修炼好自己的内功。
标签:11111111,10000000,题目,00000000,补码,char,内存,整形,原码 From: https://blog.51cto.com/u_15928027/6085460