为什么在unsigned char之间添加隐式转换?

时间:2017-03-14 10:58:20

标签: c integer-promotion compound-assignment

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 为什么添加相同类型的变量会发生隐式转换?

2 个答案:

答案 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)