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中不能对小于
i的类型进行操作nt
。搜索隐式转换。整数提升是算术转换的一部分。结果是,不能将大小的类型别名用于模运算!类型别名不编码转换秩。@KerrekSB这解释了很多。……您所经历的被称为整数提升。