0

符号なしデータ型に負の値を割り当てると、その 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(...) 関数は、異なるデータ型の引数で呼び出されます

  1. unsigned short-2 バイトであるため、-4 は 65532 として格納されます。
  2. unsigned int - 4 bytesですが、出力中に int に型キャストしようとすると、出力に -4 と表示されるため、コンパイラを騙していますが、16 進出力と論理比較結果は、内部表現が2つの賛辞で。
  3. char - 1 バイト、これは私が混乱している場所です。
  4. 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 です。

4

1 に答える 1

3

char は 1 バイトの unsigned データ型ではありませんか?

多分そうでないかもしれません。の署名charは実装定義です。

現在の実装では、明らかに署名されています。

メソッドからの出力では、 4 バイトが表示されます。これは、出力用にcompareキャストしたため、値が value に変換されるためです。intchar-4int-4

于 2012-10-14T20:46:10.227 に答える