【发布时间】:2015-10-29 13:12:42
【问题描述】:
我不确定在使用无符号字符时何时必须担心溢出。这个案例很清楚:
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);
【问题讨论】:
-
无符号操作永远不会溢出,它们只是环绕。
uint8_t c = a - b;表示uint8_t c = (uint8_t)((int)a - (int)b);在转换后产生包装结果 -
添加到@LưuVĩnhPhúc 的评论中,溢出很糟糕,非常糟糕。这是未定义的行为。无符号整数永远不会溢出。他们改为使用模 2^n 算术。
标签: c++ char overflow unsigned-char integer-promotion