3

我不确定在使用无符号字符时何时必须担心溢出。这个案例很清楚:

uint8_t a = 3;
uint8_t b = 6;
uint8_t c = a - b; // c is 253 

但是,这里会发生什么:

float d = a - b; // d is -3

在做减法之前,a 和都被转换为浮点数吗?

或者在这种情况下:

float e = (a - b) + (a - c);

所有三个变量都转换为浮点数吗?

是否有可能发生溢出的情况,即使分配给的变量是浮点数?如果e是浮点数、整数或其他任何值,规则是否相同?

此外,在这种情况下会发生什么:

int a = std::abs(a - b);
4

1 回答 1

7

您的情况不是字符到浮点数转换的结果,而是由于整数提升规则。 Cppreference声明如下(强调我的):

小整数类型(如 char)的纯右值可以转换为较大整数类型(如 int)的纯右值。特别是,算术运算符不接受小于 int 的类型作为参数,并且在左值到右值转换后自动应用整数提升(如果适用)。此转换始终保留该值。

和:

如果 unsigned char 或 unsigned short 可以保存其整个值范围,则可以将其转换为 int,否则可以将其转换为 unsigned int。

因此,在您的情况下,-运算符将值转换为整数,然后将其转换为浮点数。只有赋值c转换回 a uint8_t(溢出)。

这同样适用于std::abs示例:在减法之前转换值,并将结果传递给函数。

有关算术运算的有符号/无符号提升的更多详细信息,请参见例如此答案:https ://stackoverflow.com/a/6770275/3198247

于 2015-08-06T11:49:10.793 回答