一元 - 和 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。
我相当确定从另一个中减去一个 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。