2017-08-12 12 views
-1

次のCコードの出力はどのようになりますか?リトルエンディアンマシンで実行されると仮定します。ここで、short intは2バイトをとり、charは1バイトをとります。私のマシンで次のCコードの出力

#include<stdio.h> 
int main() { 
    short int c[5]; 
    int i = 0; 
    for(i = 0; i < 5; i++) 
     c[i] = 400 + i; 
    char *b = (char *)c; 
    printf("%d", *(b+8)); 
    return 0; 
} 

それは私のマシンがリトルエンディアンまたはビッグエンディアンである場合、私は知らない

-108 

を与えました。私はそれが与えるべきどこかに見つけた

148 

出力として。 404の下位8ビット(つまり要素c [4])は148ですが、 "%d"のために、c [4]のアドレスから開始してメモリから2バイトを読み込む必要があります。

+1

コンパイルフラグは、デフォルトのcharをsigned/unsignedなどに変更できます。 –

答えて

1

c[4]404です。 2バイトのリトルエンディアン表現では、0x940x01の2バイト、または(小数)1481の2バイトを意味します。

b+8は、c[4]のメモリを扱います。 bcharへのポインタなので、8は8バイト(4バイトの2バイトのショート)を追加することを意味します。つまり、b+8は、148を含むc[4]の最初のバイトを指しています。 (もb[8]のように書くことができます)

*(b+8)はポインタを逆参照ため、あなたにcharとして値148を与えます。実装の定義は次のとおりです。多くの共通プラットフォームでは、charは符号付きのタイプ(-128 .. 127の範囲)であるため、実際には148にはなりません。しかし、符号なしタイプ(0 .. 255)の場合、148は問題ありません。

148のビットパターンは10010100です。これを2の補数として解釈すると、-108となります。それは可変引数関数(printf)の引数リストに表示されますので、(148または-108のいずれかの)

このchar値は、自動的にintに変換されます。これは値を変更しません。

最後に、"%d"printfint引数をとり、10進数でフォーマットします。要約するので

、:あなたはバイトが負の数は2の補数

  • short intは2バイト
  • で使用8ビット

  • ある

    • マシンを持っていると仮定すると...このプログラムは-108charが署名付きの場合)または148charがu nsignedタイプ)。

  • 1

    種類は、あなたのシステムを持っているサイズはものを見るために:

    printf("char = %u\n", sizeof(char));  
    printf("short = %u\n", sizeof(short));  
    printf("int = %u\n", sizeof(int));  
    printf("long = %u\n", sizeof(long));  
    printf("long long = %u\n", sizeof(long long)); 
    

    変更し、プログラム内の行

    unsigned char *b = (unsigned char *)c; 
    printf("%d\n", *(b + 8)); 
    

    そして簡単なテスト(私はそれがないことを知っています保証されていますが、私が知っているすべてのCコンパイラはこのようにしています。異なるCDCやUNISYSマシンについては気にしません。データ

    printf(" endianes test: %s\n", (*b + (unsigned)*(b + 1) * 0x100) == 400? "little" : "big"); 
    

    別の発言の家賃タイプ:それは唯一の理由は、あなたのプログラムC [0] == 400軒の

    2

    プラットフォームによっては、charタイプがデフォルトで署名されており、デフォルトでは署名されていないタイプのため、異なるコンピュータで異なる出力が得られます。それはエンディアンとは関係がありません。これを試してください:

    char *b = (char *)c; 
        printf("%d\n", (unsigned char)*(b+8)); // always prints 148 
        printf("%d\n", (signed char)*(b+8)); // always prints -108 (=-256 +148) 
    

    デフォルト値は、プラットフォームとコンパイラの設定によって異なります。デフォルト動作は、GCCオプション-fsigned-char-funsigned-charで制御できます。

    関連する問題