我相当肯定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
我正在使用的版本的错误.....对吗?
作为参考,我正在使用arm-none-eabi-g++
编译器MSP-432
.
看着这似乎表明gcc
这里似乎犯了同样的错误.
看看这个问题似乎看起来像神弩和手臂gcc是错误的.
这里发生了什么?
这是我正在使用的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
和
e == (int)b + (int)c == (int)1 + (int)254 == 255
所以一切都按照标准的要求正常工作.