将 -1 分配给类型t
的变量size_t
,并使用 -1 和 4294967295 ( FFFFFFFF ,是2的 -1 补充;我的系统是 64位;值可能会随系统而异),然后在两种情况下,它返回 1 ,即 true 。
代码为
int main(){
unsigned int t = 10;
cout<<"t = -1: "<<(t==-1); //checks if t is -1
cout<<"\nt = 4294967295: "<<(t==4294967295); //checks if t is 4294967295
cout<<"\nt: "<<t; //printing actual value of t
int p = t; //typecasting it to int
cout<<"\np: "<<p; //printing value of p
}
实际输出为
t = -1: 1
t = 4294967295: 1
t: 4294967295
p: -1
为检查1
和(t==-1)
都返回(t==4294697295)
,但输出t = 4294697295
和输出p = -1
。
变量 t 是否包含两个值,即 -1 和 4294697295 。
绝对不是这样。
需要帮助。 系统内部实际发生了什么?
答案 0 :(得分:2)
在将带符号的值与无符号的值进行比较时,将带符号的值在比较之前转换为无符号。这是在编译过程中完成的。因此t==-1
变成t==4294967295u
,而t==4294967295
(有符号整数文字)变成t==4294967295u
。
参考:http://eel.is/c++draft/expr.arith.conv
(1.5.3) 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有符号整数类型的操作数应转换为具有无符号整数类型的操作数的类型。