gcc转换警告

wat*_*ain 6 c int casting typedef

我有以下C代码:

typedef unsigned char uint8_t;

void main(void) {
    uint8_t a = 1, b = 2, res;
    res = a + b;
}   
Run Code Online (Sandbox Code Playgroud)

当我使用编译此代码时gcc -Wconversion,我收到以下警告:

test.c: In function 'main':
test.c:5:10: warning: conversion to 'uint8_t' from 'int' may alter its value [-Wconversion]
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么出现这个警告?所有三个变量都是类型的uint8_t,所以我真的不明白它的int来源.

das*_*ght 9

我真的不明白它的int来源.

int来自C语言标准.算术运算符的所有操作数在执行操作之前都会被提升.在这种情况下uint8_t被提升为a int,所以你需要一个强制转换来避免警告:

res = (uint8_t)(a + b);
Run Code Online (Sandbox Code Playgroud)

以下是标准定义整数促销的方式:

6.3.1.1如果一个intcan表示原始类型的所有值,则该值将转换为a int; 否则,它被转换为unsigned int.这些被称为整数促销.

因为int可以保存所有可能的值uint8_t,a并且b被提升为int加法运算.

  • 另外2件事:1)在大多数处理器上,`uint8_t`需要更多周期才能进行数学运算.2)显式转换提醒您溢出语义是什么.如果你只是添加2`uint8_t`s,如果你没有将它强制转换,结果可能会大于255. (3认同)
  • @watain你不能强迫gcc不要提升为int,因为这会违反标准.实际上,如果编译器知道将仅使用最后8位,则允许编译器优化生成的代码,以便不将值提升为int.但是,代码必须表现得好像促销已经发生,包括警告.如果你必须经常回到uint8_t,你可能想要定义一个宏,比如#define TO_UINT8(x)((uint8_t)(x)) (2认同)