我的代码中有以下行
signed int test_case= -2147483648;
生成错误:
C4146一元减运算符应用于无符号类型,结果仍未签名
但这仍然是有符号整数类型的数据范围:
__ int32 signed,signed int,int -2,147,483,648 to 2,147,483,647
奇怪的是把它分配为签名长给出同样的错误,即
signed long test_case= -2147483648;
以下更改编译正常:
signed int test_case= -2147483647;
signed int test_case= 2147483649;
signed long test_case= -214748364800;
由于
答案 0 :(得分:9)
这是编译错误。
首先要注意的是:-2147483648 不一个文字。在C ++中没有负面的文字。
-2147483648是一个编译时可评估的常量表达式,由2147483648和一元减号运算符组成。
在MSVC上定位Windows x64(其中int和long都是32位),2147483648 应该是long long int
,因此-2147483648也是如此。我的理解是标准坚持在签名类型上,除非使用十六进制或八进制文字。
在这种情况下,缩小到signed int
的转换是明确定义的,因为您定位的是具有32位2补码int
类型的平台。
进一步参考:见http://en.cppreference.com/w/cpp/language/integer_literal
答案 1 :(得分:6)
由于它是一个编译器错误,这个答案特定于 MSVC ,而且从iso C ++的角度来看是错误的。有关正确和标准的答案,请参阅@Bathsheba答案。(我鼓励OP接受正确的答案,而不是未来读者的答案)。
来自MSDN:
评估编号2147483648。因为它大于 最大整数值为2147483647,2147483648的类型不是 int,但是unsigned int。
换句话说,编译器将-2147483648作为-
处理,2147483648
作为-2147483648
处理。因此,2147483648
部分被视为unsigned int
,因为它大于int
。然后编译器应用导致此警告的-
运算符。
<强>解决方案:强>
auto test_case= -2147483648ll;