考虑以下内容:
#include <iostream>
int main() {
unsigned int x = 3;
unsigned int y = 5;
std::cout << "a: " << x - y << std::endl;
std::cout << "b: " << ((int)x) - y << std::endl;
std::cout << "c: " << x - ((int)y) << std::endl;
std::cout << "d: " << ((int)x) - ((int)y) << std::endl;
}
$ g++ -Wconversion -Wall uint_stackoverflow.cc -o uint_stackoverflow && ./uint_stackoverflow
a: 4294967294
b: 4294967294
c: 4294967294
d: -2
我理解为什么 "a" 没有给出预期结果。但是为什么 "b" 和 "c" 失败让我感到困惑。对于 "b",我认为在将 "x" 转换为 "int" 后,结果仍然是 "int"。
您能为我指点迷津吗?
编辑:编译器不应该发出警告吗? g++ (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5
谢谢,
某人
unsigned
转换为signed
是明确不可移植的。C++11标准规定:“如果目标类型为有符号类型,则当源整数可以表示为目标类型时,值不会改变。否则结果是实现定义的。” - Eponymous