2

gcc では、より小さい整数型に定数を加算または減算するintと、int.

#include <cstdint>
#include <cstdio>

int main()
{
    int8_t wat = 5;
    printf("%zd\n", sizeof(wat + 1));
    return 0;
}

4 を与えます。単純な+=ステートメントを-Wconversion. その警告フラグが設定された状態で、

#include <cstdint>

int main()
{
    int8_t wat = 5;
    wat += 5;
    return 0;
}

与える

wat.cpp:7:6: 警告: 'int' から 'int8_t {aka signed char}' への変換により、その値が変更される可能性があります [-Wconversion]

この警告を抑制する方法はありますか? なぜこれが起こっているのですか?キャスティングはうまくいかないようです。

4

1 に答える 1

1

C++ 標準によると

10 算術型または列挙型のオペランドを期待する多くの二項演算子は、同様の方法で変換を行い、結果の型を生成します。目的は、結果の型でもある共通の型を生成することです。このパターンは通常の算術変換と呼ばれ、

通常の算術変換には積分昇格が含まれます

1 bool、char16_t、char32_t、または wchar_t 以外の整数型の prvalue で、整数変換ランク (4.13) が int のランクよりも小さいものは、int がソースのすべての値を表すことができる場合、int 型の prvalue に変換できます。タイプ; それ以外の場合は、ソースの prvalue を unsigned int 型の prvalue に変換できます。

だからこの表現では

wat += 5;

それはと同等です

wat = wat + 5;

wat代入の右側は型に変換されint、式の型wat + 5は int です。type の値の範囲が type の値intよりも大きいためint8_t、コンパイラは警告を発行します。

また、警告のメッセージは、警告を抑制する方法を示しています: [-Wconversion]

于 2014-04-26T23:18:11.280 に答える