我们知道,每一个数据类型都有自己的取值范围;那么char自然也不例外;
那么char数值在内存中是怎么变化的呢?
为什么127+1变成-128的呢?
下面将会讲明白
1.我们先了解char的大小是1个字节
char a=0;
a=00000000 =0
char a=1;
a=00000001 =1
a+2
a=00000010 =2
......
a+127
a=01111111 =127
a+128
a=10000000
%d运算时经过整型提升会变成-128
过程:
10000000
提升
11111111111111111111111110000000补码
1111111111111111111111110111111反码
10000000000000000000010000000=-128原码
于是a+128
a=10000000 = -128
由于-128的原码用8位无法表示,所以必须扩展到高位去表示,例如32位,然后对32位的原码计算出32位的反码和补码,最后对32位的低位字节序补码8位截断,截断的低8位的值就是-128的补码了。
a+129
=a+128再+1
11111111111111111111111110000000 【补码】
+
00000000000000000000000000001 【原码=反=补】
=
11111111111111111111111110000001 补码
【补码进行相关运算】
11111111111111111111111110000001 这是补码,转化为原码
=
11111111111111111111111110000000 反码
=
10000000000000000000001111111
=
-127
同理
a+130=128+2
10000000
+
00000010
=
10000010 补码
转化
11111110 -126
画图理解
代码测试【建议自己运行通过调试测试】
#include<stdio.h>
int main() {
char a = 0;
int i = 0;
for (i = 1; i <= 255; i++) {
a = 0;
a = a + i;
printf("a+%d = %d\n", i, a);//依次打印出a+1,a+2...a+255的值
}
return 0;
}
完结撒花