2017-02-23 14 views
-1

私がchar *に整数値をコピーしようとしていますが、私はいつも127奇妙な結果C

int main(int argc, char **argv) { 
    printf("Running test\n"); 

    char x[2]; 
    int y = 127, z = 128; 
    printf("\ny: "); fflush(stdout); 
    for (int i = 0; i < 32; i++) { 
     printf("%d", (y >> i) & 0x1); 
     fflush(stdout); 
    } 
    printf("\nz: "); fflush(stdout); 
    for (int i = 0; i < 32; i++) { 
     printf("%d", (z >> i) & 0x1); 
     fflush(stdout); 
    } 
    *x = y; 
    printf("\nxy: "); fflush(stdout); 
    for (int i = 0; i < 32; i++) { 
     printf("%d", (*x >> i) & 0x1); 
     fflush(stdout); 
    } 
    printf("\nxz: "); fflush(stdout); 
    *x = z; 
    for (int i = 0; i < 32; i++) { 
     printf("%d", (*x >> i) & 0x1); 
     fflush(stdout); 
    } 
    return 0; 
} 

結果、上記の整数で奇妙な結果を得るにはchar *に整数をコピーするとき:


走行試験

Y:11111110000000000000000000000000
Z:00000001000000000000000000000000
XY:111 11110000000000000000000000000
XZ:00000001111111111111111111111111


コンパイルするためには、私は(それが重要な場合だけ出力フラグ付き)のgcc V 5.4.0を使用します。 "GCC test.cの-o test" を

は、すべてのヘルプがされます

+0

'fflush(stdout)' 'あなたの行が終了したら' printf'だけ '\ n'を使ってください。そうでない場合は終了するまで待ってください....まれに、フラッシュすることができます。しかし、あなたがそれを使用する方法は、コードを乱雑にするだけです。 –

+2

@カミカゼ - 特定の場所で改行したくない場合はどうすればいいですか? – StoryTeller

+0

私はビット値をすべて素敵できれいに印刷するためにfflushする必要があります。結果は読み込み可能です – Miistogun

答えて

2

signed charの場合は、通常、-128〜+ 127の範囲の数値を表すことができます。ほとんどのコンパイラは、デフォルトで署名されたcharを使用します。

シフトがなくても、127を超える数字は正しく表現されません。

負の符号付き値を右シフトすると、の実装がと定義されます。

+0

通常。最も。まあ、「ほとんどの」ARMコンパイラは、デフォルトでは 'unsigned'を使用しています。不確実性に頼るべきか? – Kamiccolo

+0

@Kamiccoloそれが事実だったならば、質問は尋ねなかったでしょう。私は、多くの組み込みコンパイラがデフォルトで 'unsigned char'を使用していると付け加えましたが、OPは単にすべての状況に対する決定的な答えではなく、解決策を与えたコメントを投稿するように求めました。おそらくあなたはコメントを読まなかったでしょう。 –

+0

@Kamiccolo 'unsigned'は' unsigned int'と同じです。あなたは 'unsigned char'を意味しましたか? –