比较表达式中的无符号整数溢出

问题描述

在C语言中,使用以下代码段:

uint16_t a = 243;
uint16_t b = 65535;
uint16_t max = 65535;

if ((a + b) > max)
{
   printf("Out of range!");
}
else
{
   printf("Within range.");
}

结果将是“超出范围!”。在这种情况下适用什么类型转换规则?有人可以指出我的书面记录吗?

谢谢!

解决方法

如果int宽于17位,则abmax将被转换为inta + b不会溢出,其结果将大于max

如果int为17位宽,则abmax将转换为inta + b将溢出,并且行为不是C标准定义的。

如果int为16位宽,则abmax将不会转换。 a + b将自动换行,并且产生的结果少于max

,

根据C标准(6.5.6加法运算符)

4如果两个操作数都具有算术类型,则为通常的算术 对其进行转换。

和(6.5.8关系运算符)

3如果两个操作数都具有算术类型,则为常规算术 进行转换。

最后(6.3.1.8通常的算术转换)

  1. ...否则,将对两个操作数执行整数提升。

和(6.3.1.1布尔值,字符和整数)

2在int或 可以使用unsigned int: —具有整数类型的对象或表达式(int或 unsigned int),其整数转换等级小于或等于 int和unsigned int的等级。 —类型为_Bool,int,signed int或unsigned int的位字段。 如果一个int可以表示原始类型的所有值(受限 通过宽度,对于位字段),将值转换为int; 否则,它将转换为unsigned int。这些被称为 整数促销。 58)所有其他类型均不变 促销。

所以在if语句的情况下

if ((a + b) > max)

所有操作数根据整数提升转换为类型int。类型为int的对象能够存储整数表达式a + b的值,其中每个操作数又转换为类型int

实际上,上面的if语句您可以想象以下方式

if ( ( ( int )a + ( int )b ) > ( int )max )

或喜欢

if ( ( ( unsigned int )a + ( unsigned int )b ) > ( unsigned int )max )

取决于类型intunsigned int是否可以存储类型uint16_t的值。

例如,如果类型intunsigned int的大小与类型uint16_t的大小相同,则会发生溢出。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...