如何定义等于 -2147483648 的常量

How do I define a constant equal to -2147483648?

本文关键字:-2147483648 常量 何定义 定义      更新时间:2023-10-16

我有一个脚本生成的代码块,代码涉及一些整数常量。我遇到了一个奇怪的问题:其中一个常量等于-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,类型为intlong intlong long int,特别是可以表示其值的第一个类型。

在具有 32 位 int 的系统上,2147483648 的类型为 long intlong long int

但编译器的警告消息指示它遵循一组不同的规则。在1990 C标准中,无后缀的十进制整数常量是类型intlong intunsigned long int(没有类型long long)。因此,根据 C90 规则,2147483648很可能属于 unsigned long int 型。对其应用一元-运算符不会更改类型,并且在无符号算术规则下,结果为 2147483648

尽管 1998、2003 和 2011 ISO C++ 标准中存在此类文本属于 intlong int 类型的规则,但您似乎使用的编译器的行为与任何这些标准都不一致。

如果您的模板需要 int ,则2147483648 unsigned long int值将隐式转换为 int 。这种转换的结果(当值超过INT_MAX时)是实现定义的,但很可能是-2147483648的,这对于32位2的补码系统来说是INT_MIN的。

您说C++源是由 Python 脚本生成的,并且该值不一定-2147483648。我认为您只需要添加一个特殊情况,以便将值-2147483648生成为(-2147483647-1)。 (我确实推荐括号;在这种特殊情况下它们不是必需的,但它们是无害的,如果您在其他上下文中生成类似的常量,它们可以避免运算符优先级问题。

请注意,INT_MININT_MAX 的值可能因不同的实现而异。如果你可能需要针对不同的C++实现,你应该让你的Python脚本足够聪明,以处理不同的边界。