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

C++ 一元和n之间有区别吗-,c++,gcc,unsigned-integer,compiler-bug,C++,Gcc,Unsigned Integer,Compiler Bug,我相当肯定,从另一个减去一个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的bug,我正在使用…..对吗 作为参考,我正在为我的MSP-432使用arm-none-eabi-g++编译器 查看似乎表明,gcc似乎也犯了同样的错

我相当肯定,从另一个减去一个
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
的bug,我正在使用…..对吗

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

查看似乎表明,
gcc
似乎也犯了同样的错误

看了这么多问题,似乎戈博尔特和手臂gcc是错误的

这是怎么回事

这是我正在使用的gcc版本的一个bug……对吗

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

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

一元
-
a
提升为
int
,然后
(int)-2
在赋值中转换回
uint8\u t
,产生
c==254
(这是[0,2^8]中Z mod 2^8中-2的等价类的代表)

同样,下面几行中的二进制文件
+
-
将提升为
int
,因此我们以

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

因此,按照标准的要求,一切正常

这是我正在使用的gcc版本的一个bug……对吗

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

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

一元
-
a
提升为
int
,然后
(int)-2
在赋值中转换回
uint8\u t
,产生
c==254
(这是[0,2^8]中Z mod 2^8中-2的等价类的代表)

同样,下面几行中的二进制文件
+
-
将提升为
int
,因此我们以

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


因此,按照标准的要求,一切都正常工作。

原因是二进制运算符在执行此项工作之前会进行积分提升,并且由于
int
可以保存
uint8\t
中的所有可能值,因此使用了该选项(请参阅)。因此,减法是作为有符号操作进行的


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

原因是二进制运算符在进行运算之前会进行积分升级,并且由于
int
可以保存
中所有可能的值>uint8_t
,使用该选项(请参阅)。因此减法是作为有符号运算完成的


<计算<代码> e <代码> >存储在<代码> c>代码>中的行为已经导致您期望的模数学,存储254,然后将其添加到<代码> b>代码> 1的值。< /p>使用转换标识符,请在C中不能对小于int >代码的类型进行操作。搜索隐式转换。整数提升为PAR。算术转换的t。结果是,您不能将大小的类型别名用于模运算!类型别名不编码转换秩。@KerrekSB这解释了很多。……您所经历的被称为整数提升。请使用转换说明符?在C中,您不能对小于
i的类型进行操作nt
。搜索隐式转换。整数提升是算术转换的一部分。结果是,不能将大小的类型别名用于模运算!类型别名不编码转换秩。@KerrekSB这解释了很多。……您所经历的被称为整数提升。