#define _CRT_SECURE_NO_WARNINGS
int main()
{
char a = 128;
printf("%d", a);
return 0;
}
为什么会出现这种情况?接下来给你解释
首先我们知道128在内存中怎么存的
00000000 00000000 00000000 10000000--------原码
正数的原码反码补码是一样的
所以其补码也是 00000000 00000000 00000000 10000000
但因为是char 类型,只有一个字节 ,取出来只能切断为:10000000;
但又要以%d的形式打印,所以要整形提升,如果有不太懂什么是整形提升的小伙伴们,可以在csdn中找资源学一学,因为a是有符号的,所以提升后的结果为:
11111111 11111111 11111111 10000000----补码
转换为反码:
1111111 1111111 11111111 01111111;----补码
10000000 00000000 00000000 10000000--原码;
我们看到的就是原码为-128;
所以小伙伴学会了吗?