繁体   English   中英

一元-和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++编译器。

似乎表明gcc这里似乎犯了同样的错误。

看着这个问题,看来戈尔波特和手臂gcc是错误的。

这里发生了什么?

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

不,这不对。 在像gcc这样的大型编译器中进行简单的bug修复几乎是不可能的。

发生这种情况是由于“通常的算术转换”,特别是“整数提升”:

一元-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

因此,一切都按标准要求运行良好。

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

计算e ,将值存储在c的行为已经导致您期望的模数学,存储254,然后将其添加到b的值1中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM