如何定义等于 -2147483648 的常量
How do I define a constant equal to -2147483648?
我有一个脚本生成的代码块,代码涉及一些整数常量。我遇到了一个奇怪的问题:其中一个常量等于-2147483648(最小符号int32),Visual Studio生成以下错误:unary minus operator applied to unsigned type, result still unsigned
(这尤其奇怪,因为我没有将警告视为错误启用)。
显然,它看到一个不适合有符号类型的整数,使其无符号,然后才应用一元减号。我想结果仍然是正确的,因为它将被强制转换为int
(这实际上是一个模板参数),但我想避免警告。它只是一个 VS 功能还是标准对此有什么要说的?
这是违规的行:
typedef Proto_Int<-2147483648,32> Typeinfo_77;
在C++中,负数存储为带有 (-) 负号的正数。
这就是为什么 min int 被定义为,
#define INT_MIN (-2147483647 - 1)
对于int C++不理解2147483648。因此,如果可能的话,您也可以将2147483648写为 (-2147483647 - 1)
不带后缀的十进制整数文字,如2147483648
,类型为int
、long int
或long long int
,特别是可以表示其值的第一个类型。
在具有 32 位 int
的系统上,2147483648
的类型为 long int
或 long long int
。
但编译器的警告消息指示它遵循一组不同的规则。在1990 C标准中,无后缀的十进制整数常量是类型int
、long int
或unsigned long int
(没有类型long long
)。因此,根据 C90 规则,2147483648
很可能属于 unsigned long int
型。对其应用一元-
运算符不会更改类型,并且在无符号算术规则下,结果为 2147483648
。
尽管 1998、2003 和 2011 ISO C++ 标准中存在此类文本属于 int
或 long int
类型的规则,但您似乎使用的编译器的行为与任何这些标准都不一致。
如果您的模板需要 int
,则2147483648
unsigned long int
值将隐式转换为 int
。这种转换的结果(当值超过INT_MAX
时)是实现定义的,但很可能是-2147483648
的,这对于32位2的补码系统来说是INT_MIN
的。
您说C++源是由 Python 脚本生成的,并且该值不一定-2147483648
。我认为您只需要添加一个特殊情况,以便将值-2147483648
生成为(-2147483647-1)
。 (我确实推荐括号;在这种特殊情况下它们不是必需的,但它们是无害的,如果您在其他上下文中生成类似的常量,它们可以避免运算符优先级问题。
请注意,INT_MIN
和 INT_MAX
的值可能因不同的实现而异。如果你可能需要针对不同的C++实现,你应该让你的Python脚本足够聪明,以处理不同的边界。
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何创建长度由常量参数指定的数组
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 隐式常量/非常量运算符布尔
- 非常量变量只读位置的赋值
- 如何定义等于 -2147483648 的常量