2017-03-14 93 views
3

GCC警告说,这种代码:为什么在unsigned char之间添加隐式转换?

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

+3

这就是C的工作原理。针对效率的历史原因,存在对字符大小有符号整数的隐式转换。 –

+0

正确的术语是_implicit conversion_。 Cast意味着程序员使用了一个运算符'(type)',所以它总是显式的。演员阵容将强制进行转换,但转换也可能发生在没有演员阵容的情况下。 – Lundin

+0

@Lundin固定。谢谢。 –

回答

4

Ç任务整数优惠,引述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) 
+0

这个工程,但我认为在这种情况下'char'数据类型使用不当。我的意思是为什么要首先将文本'1'和'2'的存储声明为'char's?如果存储位置用于保存整数和字符,则可以使用整数类型,因为字符使用较小的存储空间。 – Lym

+0

@Lym-空间考虑的一个原因。不是你经常在托管系统上想到的东西,但是对于小的偏移量,人们可能会觉得有义务选择最小的类型。 (当然'uint8_t'是更好的选择)。 – StoryTeller

+0

如果你不介意我的问题,你有没有发现自己处于一种情况或阅读采用这种方法的代码。在我看来,愿意丢失一些数据,由于截断在任何情况下都是一个坏主意。只是寻找案例研究。 – Lym

5

下面介绍一下C11草案标准说约(几乎)在§5.1.2.3这个非常情况下(第15页):

实施例2

在执行片段

char c1, c2; 
/* ... */ 
c1 = c1 + c2; 

的“‘整数优惠’”要求抽象机 促进每个变量的值,以int尺寸,然后添加两个 int S和截断的总和。假设增加了两个char s可以得到 没有§5.1.2.3环境15 ISO/IEC 9899:201x委员会草案 - 2011年4月12日N1570溢出或者溢出包装无声地打包到 产生正确结果,实际执行只需要生成 相同的结果,可能会省略促销。

因此,这是因为标准要求完成。如果你看看生成的代码,编译器非常(非常)有可能在实践中完全不做转换。

相关问题