我的代码中有以下行
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/