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

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

我的代码中有以下行

signed int test_case= -2147483648;

产生错误:

C4146 unary minus operator applied to unsigned type, result still unsigned

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

__int32 signed, signed int, int –2,147,483,648 to 2,147,483,647

奇怪的是将它分配为 signed long 会给出同样的错误,即

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(其中 int 和 long 均为 32 位)的 MSVC 上,2147483648 应该long long int ,因此也会是 -2147483648。我的理解是,标准坚持有符号类型除非您使用十六进制或八进制文字。

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

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

关于c++ - Visual Studio 2015 - 编译器警告(2 级)C4146,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34944947/

相关文章:

javascript - AngularJS单元测试: Module 'admin.module' is not available

visual-studio-2015 - 全屏模式 - Windows 10 App (JS)

c++ - opencv convertTo 不工作

c++ - IE BHO - 为页面加载调用 DISPID_FILEDOWNLOAD?

vb.net - Mono 应该更好地支持哪些 .NET 功能?

asp.net - 链接按钮 CSS 在鼠标悬停时增加字体大小

html - CSS Visual Studio 2015 float 定位

c++ - 另一个类内部类的内存释放

带有计数的 for 和 while 循环中的 C++ 哨兵。陷入无限循环

c# - Visual Studio 2015 双击状态栏中的行号不起作用