2つのチャーを追加すると、intが生成されます
-
25-10-2019 - |
質問
次のように、簡単なプログラムを作成し、GCC 4.4/4.5でコンパイルしました。
int main ()
{
char u = 10;
char x = 'x';
char i = u + x;
return 0;
}
G ++ -C -WConversion A.Cpp
そして、私は次のことを持っています:
a.cpp: In function ‘int main()’:
a.cpp:5:16: warning: conversion to ‘char’ from ‘int’ may alter its value
次のコードに対して私が持っているのと同じ警告:
unsigned short u = 10;
unsigned short x = 0;
unsigned short i = u + x;
a.cpp: In function ‘int main()’:
a.cpp:5:16: warning: conversion to ‘short unsigned int’ from ‘int’ may alter its value
2つのチャー(または2つの署名のショートパンツ)を追加する理由がINTを生成する理由を教えてください。それはコンパイラのバグですか、それとも標準的な準拠ですか?
ありがとう。
解決
あなたが見ているのは、算術表現中に発生するいわゆる「通常の算術変換」の結果、特に本質的にバイナリであるもの(2つの引数を取ります)の結果です。
これは§5/9で説明されています:
算術または列挙タイプのオペランドが変換を引き起こし、結果タイプを同様の方法で生成する多くのバイナリ演算子が同様の方法で結果タイプを生成します。目的は、共通のタイプを生成することです。これは結果のタイプでもあります。このパターンはと呼ばれます 通常の算術変換, 、次のように定義されています。
- いずれかのオペランドがタイプの場合
long double
, 、もう1つはに変換されますlong double
.
- それ以外の場合、どちらのオペランドがそうであるかdouble
, 、もう1つはに変換されますdouble
.
- それ以外の場合、どちらのオペランドがそうであるかfloat
, 、もう1つはに変換されますfloat
.
- それ以外の場合、積分プロモーション(4.5)は両方のオペランドで実行されます。54)
- 次に、いずれかのオペランドがそうである場合unsigned long
もう1つはに変換されますunsigned long
.
- それ以外の場合、1つのオペランドがaの場合long int
そしてもう一方unsigned int
, 、along int
anのすべての値を表すことができますunsigned int
, 、unsigned int
に変換されますlong int
;それ以外の場合、両方のオペランドを変換するものとしますunsigned long int
.
- それ以外の場合、どちらのオペランドがそうであるかlong
, 、もう1つはに変換されますlong
.
- それ以外の場合、どちらのオペランドがそうであるかunsigned
, 、もう1つはに変換されますunsigned
.注:それ以外の場合、残りの唯一のケースは、両方のオペランドが
int
]
§4.5で暗示されているプロモーションは次のとおりです。
1タイプのrvalue
char
,signed char
,unsigned char
,short int
, 、 またunsigned short int
タイプのrvalueに変換できますint
もしもint
ソースタイプのすべての値を表すことができます。それ以外の場合、ソースrvalueはタイプのrvalueに変換できますunsigned int
.2タイプのrvalue
wchar_t
(3.9.1)または列挙タイプ(7.2)は、基礎となるタイプのすべての値を表すことができる次のタイプの最初のrvalueに変換できます。int
,unsigned int
,long
, 、 またunsigned long
.3積分ビットフィールド(9.6)のrvalueは、タイプのrvalueに変換できます
int
もしもint
ビットフィールドのすべての値を表すことができます。それ以外の場合は、に変換できますunsigned int
もしもunsigned int
ビットフィールドのすべての値を表すことができます。ビットフィールドがまだ大きい場合、統合的なプロモーションはそれには適用されません。ビットフィールドに列挙されたタイプがある場合、プロモーション目的でそのタイプの他の値として扱われます。4タイプのrvalue
bool
タイプのrvalueに変換できますint
, 、 とfalse
ゼロになりますtrue
なりながらone
.5これらの変換は積分プロモーションと呼ばれます。
ここから、」などのセクション乗法演算子" また "添加剤演算子「すべてがフレーズを持っています:」通常の算術変換が実行されます...「式のタイプを指定する。
つまり、積分算術を行うと、上記のカテゴリでタイプが決定されます。あなたの場合、プロモーションは§4.5/1でカバーされており、式のタイプは int
.
他のヒント
算術操作を行うとき char
タイプ、それが返す結果はofです int
タイプ。
これを参照してください:
char c = 'A';
cout << sizeof(c) << endl;
cout << sizeof(+c) << endl;
cout << sizeof(-c) << endl;
cout << sizeof(c-c) << endl;
cout << sizeof(c+c) << endl;
出力:
1
4
4
4
4
IDEONEでのデモンストレーション: http://www.ideone.com/jntmm