int main()
{
char a = -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
signed char b = -1;
//char里只能存 1111 1111
unsigned char c = -1;
//char里只能存 1111 1111
printf("a=%d,b=%d,c=%d", a, b, c);
//整型提升a:1111 1111 1111 1111 1111 1111 1111 1111 -转换成原码还是-1
//整型提升b:1111 1111 1111 1111 1111 1111 1111 1111 -转换成原码还是-1
//整型提升c:0000 0000 0000 0000 0000 0000 1111 1111 -转换成原码是- 255
return 0;
}
输出:-1 -1 255
int main()
{
char a = -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
printf("%u\n", a);
// 整形提升按有符号数提升:1111 1111 1111 1111 1111 1111 1000 0000 补码
// %u认为你放的是无符号数因此就认为是原码,直接输出这个数
return 0;
}
输出:4294967168
由于在注释中我已标出具体过程,所以在此不做过多解释,如有不清楚可以留言。