2012-05-23 14 views
5

可能性の重複:
Size of character ('a') in C/C++C/C++ sizeof演算子:sizeof( 'a')が異なる値を返すのはなぜですか?

私はCで初心者です、これで混乱していました。

C: Iが "%ZU" 修飾子を使用して、Cにはsizeof( 'A')を印刷しようとした、そしてそれはCOUTを用い++印刷のsizeof( 'A')Cの値4.

C++:を印刷し、そしてprintf(上記のフォーマットを使用)は両方とも値1を出力しました。

「a」はcharとして扱われるため、正しい値は1であるべきです。なぜC言語で4を返さないのですか?両方の言語で操作のサイズが異なっていますか?そうであれば、違いは何ですか?それはなぜ別の値を返しますか? どちらの場合でもgccコンパイラを使いました。

+7

CはC++ではないためです。ここでは狙っていない。 CのcharがPythonのcharと異なる場合はおそらく驚かないでしょうが、CがC++のサブセットであると多くの人が考えています。全くそうではありません。以下は良い答えですが、結論としてCとC++は2つの異なる言語です。 – Dan

答えて

11

Cでは、'a'は文字定数で、整数として扱われるため、サイズは4ですが、C++ではcharと扱われます。 Cでは

Size of character ('a') in C/C++

+0

私は検索しようとしましたが、何の質問とも一致しませんでした。重複していることを知らせてくれてありがとう。 –

+0

-1:Intのサイズがcharとlongの関係を超えてCに定義されていません。 – mattnz

+3

@mattnz - リンクされた答えを読んだ場合、 'sizeof'の' int'がプラットフォーム依存であるというコメント(最初と唯一の答え)をはっきりと見ることができます。私はこの問題に対処していませんでした。なぜなら、リンクされたスレッドはそれに対処しており、modはこのスレッドを閉じ、2. Askerの質問の文脈では、intのsizeofが自分のマシン上で4であることを示しています。 – BlackJack

4

文字リテラル(定数)int型があります。これは、ここでの質問の重複しています。 だから、最初の4つのステートメントのすべてが、少なくともgccの上1つの文字定数と彼らはすべての印刷4 == sizef(int型)、(Ubuntuのようリテラルを検討し、以下のプログラム

#include <stdio.h> 

main(int argc, char *argv[]) 
{ 
    printf("%zu\n", sizeof('a')); 
    printf("%zu\n", sizeof('ab')); 
    printf("%zu\n", sizeof('abc')); 
    printf("%zu\n", sizeof('abcd')); 

    printf("%u\n", 'a'); 
    printf("%u\n", 'ab'); 
    printf("%u\n", 'abc'); 
    printf("%u\n", 'abcd'); 

    printf("%x\n", 'a'); 
    printf("%x\n", 'ab'); 
    printf("%x\n", 'abc'); 
    printf("%x\n", 'abcd'); 

    printf("%c\n", 'a'); 
    printf("%c\n", 'ab'); 
    printf("%c\n", 'abc'); 
    printf("%c\n", 'abcd'); 
} 

を検討4.4.3- 4ubuntu5.1)4.4.3。

warning: multi-character character constant 

基本的には、リテラル文字が最初に左から右へ、高次バイトからint型を構成する4バイト、 を指定します。このコンパイラは、上記のプログラムのためのいくつかの警告を出力すること 注意。 不足している主要なバイトは だから、私のマシン上でのprintf文の第二と第三のグループは、(リテラル で4つの文字のレイアウトを参照してください進数出力で

97 
24930 
6382179 
1633837924 
61 
6162 
616263 
61626364 

を印刷0で満たされていますASCIIコードは左から右へ): 'a'は 最上位バイト0x61にマップされます。

最後に、第4グループの印刷物:

a 
b 
c 
d 

は、すなわち文字リテラルは整数としてスタックにプッシュされているが、printfの のみcharとして、その整数の最下位バイトを印刷します。

C++も同様の動作をしますが、1バイトの文字リテラルは、int型ではなくchar型の とみなされます。プログラム

#include <iostream> 

using namespace std; 

main(int argc, char *argv[]) 
{ 
    cout << sizeof('a') << endl; 
    cout << sizeof('ab') << endl; 
    cout << sizeof('abc') << endl; 
    cout << sizeof('abcd') << endl; 

    cout << 'a' << endl; 
    cout << 'ab' << endl; 
    cout << 'abc' << endl; 
    cout << 'abcd' << endl; 
} 

はGCCを使用してコンパイルされ、同様の警告が表示されます。その出力はCのそれとは異なる です:

1 
4 
4 
4 
a 
24930 
6382179 
1633837924 

だから、1バイトの文字リテラルはcharとして扱われ、マルチバイトリテラル はintとして扱われています。

重要な注意

私はintは4つのバイトを持つ、32ビットのLinuxシステム上で私のテストを実行しました。他のシステムで何が起こるかを見ると、興味深いのは でしょう。 64ビットシステムで実行します。

EDIT

固定答え(ヒントのおかげで):文字リテラルは、Cでint型を持っている、彼ら はintにキャストされていません。

+0

ほとんどのシステムは、16ビットのものを除いて、4バイトの 'int'を持っています。 –

+1

小さな不正確性:文字定数が 'int'にキャストされず、' Cに 'int'をタイプします。 –

+0

ありがとう、私はこれを修正します。つまり、割り当てられるたびにcharにキャストされます。 – Giorgio

関連する問題