Visual Studio 2015 - 编译器警告(级别 2)C4146
Visual Studio 2015 - Compiler Warning (level 2) C4146
我的代码中有以下行
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;
- 被解释为低级别const的const对象的地址
- 在Windows中查找扬声器输出的当前音量级别
- FFMPEG配置文件级别id大小无效
- 固有构造函数的字符和访问级别
- ascii 和 unicode 在处理级别有什么区别吗?
- fastrtps:如何在发布/订阅级别使用 DDS 历史记录?
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- C++std::atomic在程序员级别保证了什么
- Cmake:为 C 设置警告级别,并为 MSVC 单独设置C++代码(Visual C++)
- 覆盖应用程序的低级别键盘挂钩问题
- 二叉树级别顺序遍历在leetcode中
- 如何循环 n 次,在 xml 文件中每个循环一个级别
- 警告级别为 3 的 int 的 std::vector push_back 处的编译器警告
- 如何查看在程序级别为我的程序创建了多少 vtable 和 vpointer
- 下步指针键入用于shared_ptr的级别
- 对于优化级别为 0 的 std::vector,析构函数被调用两次
- 当依赖关系和依赖关系都是多态时,在哪个继承级别存储依赖关系指针?
- 返回二叉搜索树特定级别的节点数的函数
- 二叉树级别顺序插入 c++
- Visual Studio 2015 - 编译器警告(级别 2)C4146