32平台机器
2进制
-128 原码:1000 0000 0000 0000 0000 0000 1000 0000
反码:1111 1111 1111 1111 1111 1111 0111 1111
补码:1111 1111 1111 1111 1111 1111 1000 0000
char(类型) 存 1000 0000
%u 时 先整形提升 1111 1111 1111 1111 1111 1111 1000 0000 因为无符号(%u)直接输出1111 1111 1111 1111 1111 1111 1000 0000
-1 原码:1000 0000 0000 0000 0000 0000 0000 0001
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111
char(类型)存储 1111 1111
%d 先整形提升1111 1111 1111 1111 1111 1111 1111 1111(补码)
找到源码(1000 0000 0000 0000 0000 0000 0000 0001)再输出
char a = -1; signed char b = -1;相同 所以都输出-1
unsigned char c = -1;
原码:1000 0000 0000 0000 0000 0000 0000 0001
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111
char(类型)存储 1111 1111
无符号数整形提升:左边直接补零
整形提升为
0000 0000 0000 0000 0000 0000 1111 1111
正数源码 反码 补码相同所以输出0000 0000 0000 0000 0000 0000 1111 1111就是255
有符合char类型取值范围为-128到127(包括-128 和127)
而127再加1就是-128
因为
0000 0000 0000 0000 0000 0000 1000 0000(128)正数源码 反码 补码相同
char(类型)中存的是1000 0000
先整形提升 1111 1111 1111 1111 1111 1111 1000 0000 因为无符号(%u)直接输出1111 1111 1111 1111 1111 1111 1000 0000
而1111 1111 1111 1111 1111 1111 1000 0000 是-128的反码
(-128 源码 反码 补码 前面有写)