符号なしデータ型に負の値を割り当てると、その 2 の補数が格納されることを知っています。これは、データ型が格納できる最大値から、割り当てた負の値を引いたものです。それをテストするために、それを示すプログラムを作成しましたが、char データ型の動作を理解できません。
#include <iostream>
using namespace std;
template<class T>
void compare(T a,T b)
{
cout<<dec<<"a:"<<(int)a<<"\tb:"<<(int)b<<endl; //first line
cout<<hex<<"a:"<<(int)a<<"\tb:"<<(int)b<<endl; //second line
if(a>b)
cout<<"a is greater than b"<<endl;
else
cout<<"b is greater than a"<<endl;
}
int main()
{
unsigned short as=2;
unsigned short bs=-4;
compare(as,bs);
unsigned int al = 2;
unsigned int bl =-4;
compare(al,bl);
char ac=2;
char bc=-4;
compare(ac,bc);
int ai =2;
int bi =-4;
compare(ai,bi);
}
出力は
a:2 b:65532
a:2 b:fffc
b is greater than a
a:2 b:-4
a:2 b:fffffffc
b is greater than a
a:2 b:-4
a:2 b:fffffffc
a is greater than b
a:2 b:-4
a:2 b:fffffffc
a is greater than b
compare(...) 関数は、異なるデータ型の引数で呼び出されます
- unsigned short-2 バイトであるため、-4 は 65532 として格納されます。
- unsigned int - 4 bytesですが、出力中に int に型キャストしようとすると、出力に -4 と表示されるため、コンパイラを騙していますが、16 進出力と論理比較結果は、内部表現が2つの賛辞で。
- char - 1 バイト、これは私が混乱している場所です。
- int - 4 バイト、符号付きデータ型、予期しないものは何もない、通常の結果。
私が尋ねなければならない質問は、なぜ char が signed int のように振る舞うかということです。結果の最初の行を出力する前に int に型キャストしているのに、char が 1 バイトで int が 4 バイトの場合でも、char が int に似た値を示すのはなぜですか。unsigned short は、メモリ要件が 2 バイトであるため、異なる値を示しました。unsigned int と int は結果の最初の行で同じ結果を示しています。どちらも 4 バイトであり、コンパイラは正常にだまされ、受け入れられるからです。しかし、メモリ レイアウトが int のメモリ レイアウトと同じであるかのように、char も同じ値を示しているのはなぜでしょうか。
また、論理比較は、char が unsigned データ型としてではなく、signed データ型として動作することも示しています。unsigned データ型は b を 1 より大きいと表示しています。char は、符号付きデータ型に関して、 a が b より大きいことを示しています。なんで?
char は 1 バイトの unsigned データ型ではありませんか? これは、B.Tech の学位で C と C++ のコースを受講したときに学んだことです。
どんな説明でも役に立ちます。使用するコンパイラは mingw 2.19.1 です。