#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",i<<1);
return 0;
}
このプログラムが 256 を出力するのはなぜですか?
私が理解しているように、0x80= 0b10000000 であり、unsigned char は 8 ビットであるため、左シフト後に「1」がオーバーフローし、出力は 256 ではなく 0 になるはずです。
#include <stdio.h>
int main()
{
unsigned char i=0x80;
printf("%d",i<<1);
return 0;
}
このプログラムが 256 を出力するのはなぜですか?
私が理解しているように、0x80= 0b10000000 であり、unsigned char は 8 ビットであるため、左シフト後に「1」がオーバーフローし、出力は 256 ではなく 0 になるはずです。
これは、C の整数昇格規則の結果です。基本的に、式に入るほとんどの変数は「プロモート」されるため、このような操作で精度が失われることはありません。次に、 C の可変引数規則に従って、 int
intoとして渡されます。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;
}
署名なしで印刷するための特別な形式を忘れないでください。
printf("%u",(unsigned char)(i<<1));