我的代码中包含以下行
signed int test_case= -2147483648;
会产生错误:
C4146一元减运算符应用于无符号类型,结果仍为无符号
但这仍然是带符号整数类型的数据范围:
__int32已签名,已签名int,int –2,147,483,648至2,147,483,647
奇怪的是将它分配为有符号的long会给出相同的错误,即
signed long test_case= -2147483648;
下面的更改将编译确定:
signed int test_case= -2147483647;
signed int test_case= 2147483649;
signed long test_case= -214748364800;
谢谢
由于它是编译器错误,因此此答案特定于MSVC,从iso C ++角度来看,这是错误的。有关正确和标准的答案,请参见@Bathsheba答案。(我鼓励OP接受正确的答案,而不是为将来的读者使用此答案)。
从MSDN:
评估数字2147483648。因为它大于2147483647的最大整数值,所以2147483648的类型不是int,而是unsigned int。
换句话说,编译器将对-2147483648进行处理,-
而2147483648
不是进行处理-2147483648
。因此该2147483648
部分被认为是unsigned int
因为它大于int
。然后编译器应用-
导致该警告的运算符。
解决方案:
auto test_case= -2147483648ll;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句