【问题标题】:How can I fix error code C4146 "unary minus operator applied to unsigned type.result still unsigned"?如何修复错误代码 C4146“一元减号运算符应用于无符号类型。结果仍然无符号”?
【发布时间】:2015-03-30 20:46:29
【问题描述】:

数据类型int的最小值是-2,147,483,648。

所以,我输入了

int val = -2147483648;

但是,它有一个错误:

unary minus operator applied to unsigned type.result still unsigned

我该如何解决?

【问题讨论】:

  • 解决这个问题的一种方法是让自己成为一个符合标准的编译器。严重地。自 1999 年以来,C 强制十进制常量始终为 signed 类型。所以你的错误是你的编译器的错误。
  • @Jens Gustedt:确实如此,但在这种情况下,不符合问题并不是必需的。在 C99 及更高版本中,如果没有足够宽来表示常量的有符号整数类型,则行为是 undefined。这也“涵盖”了 C89/90 行为:使用无符号类型只不过是未定义行为的特定表现。它也可以看作是定义未定义的编译器特定的扩展。
  • @AnT,这是一个一致性问题。对于 C99,始终存在至少 64 位宽的整数类型,因此这里的常量始终是有效的整数常量。

标签: c integer precision


【解决方案1】:

2147483648 超出您平台上的int 范围。

要么使用精度更高的类型来表示常量

int val = -2147483648L;
// or
int val = -2147483648LL;

(取决于在您的平台上哪种类型的精度高于int)。

或者诉诸于古老的- 1技巧

int val = -2147483647 - 1;

【讨论】:

  • 如果目标是获得可能的最低整数值,他也可以使用来自limits.hINT_MIN
  • -1 技巧很不错,因为它触发的编译器警告更少,具体取决于您的编译器和构建设置。
  • @AnT 嗨,你知道有什么方法可以删除那个警告检查吗?它也会导致我这边出错,但这有点奇怪,因为它与 gmp.h ressource 的文件 6.1.1 . (gmp mp)
【解决方案2】:

-2,147,483,648 被解释为对2147483648 的否定。 2147483648 超出系统上的最大正整数,被视为无符号。

相反,试试

-2147483647 - 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多