所以我正在玩各种类型,下面我得出了这个奇怪的结果.调试它没有任何意义,然后唯一的结果是检查c ++ spects,这没有多大帮助.我想知道你是否可能知道这里发生了什么,如果它是32Bit和/或64Bit具体问题.
#includeusing namespace std; int main() { unsigned int u = 1; signed int i = 1; long long lu = -1 * u; long long li = -1 * i; std::cout<<"this is a weird " << lu << " " << li << std::endl; return 0; }
输出的位置
this is a weird 4294967295 -1
Kerrek SB.. 5
关键的观察是表达式-1 * u
是类型的unsigned int
.这是因为算术转换规则*说,如果一个操作数是unsigned int
另一种是signed int
,那么后者操作数转换到unsigned int
.算术表达式最终仅针对同构操作数定义,因此转换在操作正确之前发生.
转换为-1
to 的结果unsigned int
是一个大的正数,可以表示为a long long int
,它是您在输出中看到的数字.
目前,那是[expr] /(11.5.3).
关键的观察是表达式-1 * u
是类型的unsigned int
.这是因为算术转换规则*说,如果一个操作数是unsigned int
另一种是signed int
,那么后者操作数转换到unsigned int
.算术表达式最终仅针对同构操作数定义,因此转换在操作正确之前发生.
转换为-1
to 的结果unsigned int
是一个大的正数,可以表示为a long long int
,它是您在输出中看到的数字.
目前,那是[expr] /(11.5.3).