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

Visual Studio 2015 - Compiler Warning (level 2) C4146

本文关键字:级别 C4146 警告 Studio 2015 编译器 Visual      更新时间:2023-10-16

我的代码中有以下行

signed int test_case= -2147483648;

生成错误:

C4146 一元减号运算符应用于无符号类型,结果仍然无符号

但这仍然是有符号整数类型的数据范围:

__int32签名,签名 int,int –2,147,483,648 到 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编译器中看到这个问题?
  • 它如何定义数据类型?
  • 如何检查范围?
  • 为什么它似乎忽略了"已签名"的作业?

谢谢

这是一个

编译器错误。

首先要注意的是:-2147483648不是字面意思。C++中没有否定字面这样的东西。

-2147483648 是由 2147483648 和一元减运算符组成的编译时可评估常量表达式。

在面向 Windows x64 的 MSVC 上(其中 int 和 long 都是 32 位),2147483648 应该是一个long long int,因此 -2147483648 也是如此。我的理解是,标准坚持使用有符号类型,除非您使用十六进制或八进制文字。

在这种情况下,缩小到 signed int 的转换是明确定义的,因为您的目标是具有 32 位 2 补码int类型的平台。

进一步参考:见 http://en.cppreference.com/w/cpp/language/integer_literal

由于它是一个

编译器错误,因此此答案特定于MSVC,从iso C++的角度来看是错误的。有关正确和标准答案,请参阅@Bathsheba答案。(我鼓励OP接受正确的答案,而不是未来的读者这个答案)。


从 MSDN:

计算2147483648的数量。因为它大于 最大整数值为 2147483647,2147483648的类型不是 int,但未签名的 int。

换句话说,编译器将 -2147483648 处理为-2147483648处理不-2147483648。因此,2147483648部分被认为是unsigned int的,因为它比int大。然后编译器应用导致此警告的 - 运算符。

溶液:

auto test_case= -2147483648ll;