GCC警告此代码:
unsigned char i = 1;
unsigned char j = 2;
i += j;
表示:
warning: conversion to 'unsigned char' from 'int' may alter its value [-Wconversion]
i += j;
^
似乎j
已隐式转换为int
为什么添加相同类型的变量会发生隐式转换?
答案 0 :(得分:5)
以下是C11标准草案中关于(几乎)§5.1.2.3(第15页)中这种情况的说法:
示例2
执行片段
''整数促销''要求抽象机器 将每个变量的值提升为char c1, c2; /* ... */ c1 = c1 + c2;
int
大小,然后添加两个int
并截断总和。只要添加两个char
即可 没有§5.1.2.3环境15 ISO / IEC 9899:201x委员会草案 - 2011年4月12日N1570溢出,或溢出包裹默默地 产生正确的结果,实际执行只需要产生 同样的结果,可能省略了促销活动。
所以,它已经完成,因为标准要求它完成。如果你看一下生成的代码,很可能编译器很聪明,在实践中根本不进行转换。
答案 1 :(得分:4)
C要求整数促销,引用C11 N1570/6.3.1.1p2
如果可以使用int或unsigned int,则可以在表达式中使用以下内容:
- 具有整数类型(int或unsigned int除外)的对象或表达式,其整数转换等级小于或等于int和unsigned int的等级。
如果int可以表示原始类型的所有值(受宽度限制,对于位域),则该值将转换为int
因此,您的unsigned char
变量用于此类表达式,因此转换为int
,因为i += j
在功能上等同于i = i + j
。
如果知道某些,结果在unsigned char
范围内,那么只需在分配前对添加结果应用强制转换,如下所示:
i = (unsigned char)(i + j)