uint8_t 操作,它们什么时候溢出?
uint8_t operations, when do they overflow?
我不确定在使用无符号字符时何时需要担心溢出。这个案例很清楚:
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);
三个变量是否都转换为float?
是否存在可能发生溢出的情况,即使分配给的变量是浮点数?如果 e 是浮点数、整数或其他任何值,规则是否相同?
另外,遇到这种情况会发生什么:
int a = std::abs(a - b);
您的情况不是字符到浮点数转换的结果,而是整数提升规则造成的。
Cppreference 陈述如下(强调我的):
Prvalues of small integral types (such as char) may be converted to prvalues of larger integral types (such as int). In particular, arithmetic operators do not accept types smaller than int as arguments, and integral promotions are automatically applied after lvalue-to-rvalue conversion, if applicable. This conversion always preserves the value.
并且:
unsigned char or unsigned short can be converted to int if it can hold its entire value range, and unsigned int otherwise.
因此,在您的情况下,-
运算符将值转换为整数,然后再转换为浮点数。只有对 c
的赋值会转换回 uint8_t
(溢出)。
这同样适用于 std::abs
示例:在减法之前转换值,并将结果传递给函数。
有关 signed/unsigned 算术运算促销的更多详细信息,请参阅此答案的示例:
我不确定在使用无符号字符时何时需要担心溢出。这个案例很清楚:
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);
三个变量是否都转换为float?
是否存在可能发生溢出的情况,即使分配给的变量是浮点数?如果 e 是浮点数、整数或其他任何值,规则是否相同?
另外,遇到这种情况会发生什么:
int a = std::abs(a - b);
您的情况不是字符到浮点数转换的结果,而是整数提升规则造成的。 Cppreference 陈述如下(强调我的):
Prvalues of small integral types (such as char) may be converted to prvalues of larger integral types (such as int). In particular, arithmetic operators do not accept types smaller than int as arguments, and integral promotions are automatically applied after lvalue-to-rvalue conversion, if applicable. This conversion always preserves the value.
并且:
unsigned char or unsigned short can be converted to int if it can hold its entire value range, and unsigned int otherwise.
因此,在您的情况下,-
运算符将值转换为整数,然后再转换为浮点数。只有对 c
的赋值会转换回 uint8_t
(溢出)。
这同样适用于 std::abs
示例:在减法之前转换值,并将结果传递给函数。
有关 signed/unsigned 算术运算促销的更多详细信息,请参阅此答案的示例: