8
#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",i<<1);
    return 0;
}

このプログラムが 256 を出力するのはなぜですか?

私が理解しているように、0x80= 0b10000000 であり、unsigned char は 8 ビットであるため、左シフト後に「1」がオーバーフローし、出力は 256 ではなく 0 になるはずです。

4

2 に答える 2

14

これは、C の整数昇格規則の結果です。基本的に、式に入るほとんどの変数は「プロモート」されるため、このような操作で精度が失われることはありません。次に、 C の可変引数規則に従って、 intintoとして渡されます。printf

探しているものが必要な場合は、キャストバックする必要がありますunsigned char:

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",((unsigned char)(i<<1)));
    return 0;
}

注:%cスティーブンのコメントで指定されているように使用%cすると、整数も期待されるため機能しません。

編集:代わりに、これを行うことができます:

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    unsigned char res = i<<1;
    printf("%d",res);
    return 0;
}

また

#include <stdio.h>
int main()
{
    unsigned char i=0x80;
    printf("%d",(i<<1) & 0xFF);
    return 0;
}
于 2010-07-30T16:51:49.087 に答える
0

署名なしで印刷するための特別な形式を忘れないでください。

printf("%u",(unsigned char)(i<<1));
于 2010-07-30T17:30:25.967 に答える