7

私は次のCコードを持っています:

typedef unsigned char uint8_t;

void main(void) {
    uint8_t a = 1, b = 2, res;
    res = a + b;
}   

を使用してこのコードをコンパイルするとgcc -Wconversion、次の警告が表示されます。

test.c: In function 'main':
test.c:5:10: warning: conversion to 'uint8_t' from 'int' may alter its value [-Wconversion]

誰かがこの警告が表示される理由を説明できますか? 3 つの変数はすべて typeであるため、 がどこから来るuint8_tのかよくわかりません。int

4

3 に答える 3

10

intがどこから来たのかよくわかりません。

intC 言語標準に由来します。算術演算子のすべてのオペランドは、演算を実行する前に昇格されます。この場合uint8_tは に昇格intされるため、警告を回避するにはキャストが必要です。

res = (uint8_t)(a + b);

標準が整数プロモーションを定義する方法は次のとおりです。

6.3.1.1intが元の型のすべての値を表すことができる場合、値はint;に変換されます。それ以外の場合は、に変換されますunsigned int。これらは整数プロモーションと呼ばれます。

intのすべての可能な値を保持できるため、加算演算のために にuint8_t昇格abれます。int

于 2014-01-24T14:46:12.613 に答える
4

-Wconversion整数プロモーションに関する既存の回答に追加するだけで、何が警告されているかを説明する価値があるかもしれません。

abは両方ともであるためuint8_t、 の結果はa + b別の に収まらない可能性がありuint8_tます。結果を に代入することによりuint8_t、値を変更する可能性のある変換をコンパイラに強制的に実行させます。したがって、res変数は実際には の実際の値を表していない可能性がありますa + b

たとえば、abが両方ともの場合、次のよう0xffになります。

  • a + bis0x1feおよび has タイプint
  • (uint8_t)(a + b)0xfe
于 2014-01-24T15:02:45.110 に答える