#include <iostream>
using namespace std;
int main()
{
int a;
long b;
cout<<sizeof(a+b);
return 0;
}
出力は8(長い変数のサイズ)です。なぜそれは彼らの合計を返さないのですか?
Sizeof演算子は、使用された式をオペランドとして評価しません。式のタイプを決定し、そのタイプのオブジェクトが持つことができるサイズを返します。
たとえば、次のコードスニペットがある場合
int i = 10;
std::cout << sizeof( ++i ) << '\n';
その場合、変数i
の値は変更されません。
C++ 17標準(5.3.3 Sizeof)から
1 sizeof演算子は、そのオペランドのオブジェクト表現のバイト数を生成します。 オペランドは、評価されていないオペランドである式(句5)、または括弧で囲まれたtype-id ...のいずれかです。
このsizeofオペランドで使用される式のタイプを判別するには
cout<<sizeof(a+b);
+通常の算術変換を使用して、加算演算子+のオペランドの一般的なタイプが推定されます。
Long型のランクはint型のランクよりも高いため、式の一般的な型はlongであり、演算子sizeofはlong型のオブジェクトのサイズを返します。
算術演算の結果の型は、オペランドの型と同じであるため(変換後) 1)、同じタイプで、サイズも同じです。加算は、両方のオペランドのバイトがメモリ内で横並びになるバイト連結演算ではありません。結果の型がオペランドサイズの合計サイズを持つことを期待する理由はありません。
ループに整数を追加するプログラムを考えてみましょう。 10億の整数を加算すると、結果は数ギガバイトのサイズになると思いますか?
1 具体的には、オペランドは最初に共通の型に変換されます。混合型には算術演算はありません。つまり、一般的なタイプは2つのうち大きい方であり、この場合はlong
であり、システム上のサイズはたまたま8です(それ以前は、より小さい場合、intへの昇格がありました。関係するオペランド)。
int
からfloat
への自動型キャストのため。 2つの互換性のないデータ型が追加されると、最も精度の低いデータ型がより正確なデータ型に自動的にキャストされます。この場合、int
には4バイトのメモリがあり、long
には8バイトのメモリがあります(もちろん、システムアーキテクチャによって異なります)。そのため、追加する前にint
がlong
として最初にキャストされます。