Visual Studio 2015 - 编译器警告(级别2)C4146

时间:2016-01-22 10:53:04

标签: c++ visual-studio visual-studio-2015 language-lawyer compiler-warnings

我的代码中有以下行

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;
  • 有没有人在Visual Studio 2015编译器中看到过这个问题?
  • 如何定义数据类型?
  • 如何检查范围?
  • 为什么它似乎忽略了#34;签名"分配

由于

2 个答案:

答案 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;