一元 - 和 n - 之间有区别吗

Is there a difference between unary - and n -

我相当确定从另一个中减去一个 uint8_t 应该会得到另一个无符号数,但是我的一些结果让我感到困惑。

  uint8_t a = 2;
  uint8_t b = 1;
  uint8_t c = -a;
  long d = b - a;
  long e = b + c;

当我获得 d 的值时,它会生成 -1,而 e 是我期望的 255。这是我使用的 gcc 版本的错误......对吗?

作为参考,我正在为我的 MSP-432 使用 arm-none-eabi-g++ 编译器。

this似乎表明gcc只是在这里犯了同样的错误。

this SO问题好像godbolt和arm gcc是错的

这是怎么回事?

This is a bug with the version of gcc I am using.....right?

不,不是。在像 gcc 这样的大型编译器中出现这么简单的错误是极不可能的。

发生的事情是由于 "usual arithmetic conversions",特别是 "integer promotion":

一元 -a 提升为 int,然后 (int)-2 在赋值中转换回 uint8_t,产生 c == 254(代表Zmod2^8中-2的等价class位于[0, 2^8))。

同样,下面行中的二进制 +- 提升为 int,所以我们最终得到

d == (int)b - (int)a == (int)1 - (int)2 == -1

e == (int)b + (int)c == (int)1 + (int)254 == 255

所以一切都按照标准要求正常工作。

原因是二元运算符在执行工作之前会进行整数提升,并且由于 int 可以包含 uint8_t 中的所有可能值,因此使用了该选择(请参阅 http://en.cppreference.com/w/cpp/language/implicit_conversion#Integral_promotion) .因此减法是作为有符号运算完成的。

在计算 e 时,在 c 中存储一个值的行为已经产生了您预期的模数学,存储 254,然后将其添加到 b 的值 1。