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

Dar*_*bik 1 c++ gcc compiler-bug unsigned-integer

我相当肯定uint8_t从另一个中减去一个应该导致另一个无符号数,但我的一些结果让我感到困惑.

  uint8_t a = 2;
  uint8_t b = 1;
  uint8_t c = -a;
  long d = b - a;
  long e = b + c;
Run Code Online (Sandbox Code Playgroud)

当我获得d它产生的价值时-1,e正如我所期望的那样255.这是gcc我正在使用的版本的错误.....对吗?

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

看着这似乎表明gcc这里似乎犯了同样的错误.

看看这个问题似乎看起来像神弩和手臂gcc是错误的.

这里发生了什么?

Bau*_*gen 6

这是我正在使用的gcc版本的错误.....对吗?

不,这不对.像gcc这样的大型编译器中出现错误的东西极不可能.

会发生什么是由于"通常的算术转换",特别是"整数提升":

一元-促进a到int,然后(int)-2转换回到uint8_t赋值中,屈服c == 254(这是Z mod 2 ^ 8中等价类-2的代表,位于[0,2 ^ 8)).

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

d == (int)b - (int)a == (int)1 - (int)2 == -1
Run Code Online (Sandbox Code Playgroud)

和

e == (int)b + (int)c == (int)1 + (int)254 == 255
Run Code Online (Sandbox Code Playgroud)

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