在下面的代码中,当我运行它时,我得到y=-124
和z=4294967172
你能解释一下吗? (测试如果x<128
没有任何问题)
char x=132;
signed y=x;
unsigned z=x;
cout<<y<<endl;
cout<<z<<endl;
答案 0 :(得分:3)
char
是8位,所以当你写char x = 132
时,实际上是这样做的:
x = 1000 0100
signed int
和unsigned int
都是32位,每当您将“较小”变量的值分配为“较大”变量时,系统会使用符号扩展,即将符号位复制到左侧的每一位。所以价值变成:
1111 1111 1111 1111 1111 1111 1000 0100
如果将其解释为有符号值,则为-124,而作为无符号值则为4294967172。
此外,如果您在第一行中将char
定义为unsigned
,则总是会得到132,因为未对无符号值执行符号扩展。
答案 1 :(得分:2)
char
s只有8位,这意味着它们只能包含256个值,包括0.您使用的是带符号的char,这意味着为负数保留了一半的值,使得最大正值127。
答案 2 :(得分:1)
在第一行x为10000100(132为10000100b)之后,它是机器中的-124值(见here)。所以在第二行y之后是-124。
之后第3行z是111 ... 1110000100b。高位有1,因为你设置了一个负数,但是当你打印编译器时打印它的二进制值,因为z是无符号的。