以下のようなプログラムで、符号付き整数が-veまたは+値になるかどうかを識別する方法を示します。cの符号なし整数
int main()
{
int a=0xDEADBEEF;
printf("%d",a);
return 0;
}
この出力は-ve.Butにありますが、ビジュアルスタジオで実行することなく簡単に識別できます。
以下のようなプログラムで、符号付き整数が-veまたは+値になるかどうかを識別する方法を示します。cの符号なし整数
int main()
{
int a=0xDEADBEEF;
printf("%d",a);
return 0;
}
この出力は-ve.Butにありますが、ビジュアルスタジオで実行することなく簡単に識別できます。
Cには、負の数は、最上位ビットは符号を表し2の補数、です。まず、を使用して、現在のプラットフォーム上にあるint
のビット数を決定します。右シフトで最高ビットを得るには、size - 1
でシフトする必要があります。右シフトはCで算術演算です(最上位ビットが1
の場合、左から1
をintに入力します)、0x01
(または単に1
)を使用して余分なビットをすべて削除する必要があります)。
結果は、入力が負の場合は1
、正の場合は0
の値を持つint
です。
ハイパーバイト(あなたのケースでは、DE
)を取り出し、上半分(D
)を書き出し、そのハイビットがゼロか1であることを確認します。
+1エレガントでポータブルなソリューションです。 –
...まだコンパイルと実行が必要です。 –
また、ペーパーで行うこともできます。これは、数字よりも簡単なので、数値を書き出す必要はありません。 – Femaref
これを決めるには、幅(数値ビットの数)をint
で知る必要があります。
また、フォーマット文字列の末尾に\n
を付けて出力する必要があります。
タイプのビット深度に応じて、値が0x80,0x8000,0x80000000、または0x8000000000000000より小さいかどうかを確認してください。それより小さい場合は正、そうでない場合は負です。それを説明するために
int negative = (input >> ((sizeof(int) * 8) - 1)) & 0x01;
:いくつかのビット単位の魔法で
最初のビット(符号ビット)が1の場合、値は負になります。それ以外の場合は正です。
ところで、正の数に比べてもう1つ負の数があります。
0xDEADBEEF
はのシステムでINT_MAX
より大きいため、int
への変換は実装定義です。一般的な2の補数の実装では、[INT_MIN,INT_MAX]
の範囲内の減少モジュロ2*INT_MAX+2
として定義されます。
印刷された整数が正か負かを認識したいのですか? –
ええ、gccで実行してください:D –