2011-08-06 18 views
2

以下のようなプログラムで、符号付き整数が-veまたは+値になるかどうかを識別する方法を示します。cの符号なし整数

int main() 
{ 
    int a=0xDEADBEEF; 
    printf("%d",a); 
    return 0; 
} 

この出力は-ve.Butにありますが、ビジュアルスタジオで実行することなく簡単に識別できます。

+0

印刷された整数が正か負かを認識したいのですか? –

+0

ええ、gccで実行してください:D –

答えて

6

Cには、負の数は、最上位ビットは符号を表し2の補数、です。まず、を使用して、現在のプラットフォーム上にあるintのビット数を決定します。右シフトで最高ビットを得るには、size - 1でシフトする必要があります。右シフトはCで算術演算です(最上位ビットが1の場合、左から1をintに入力します)、0x01(または単に1)を使用して余分なビットをすべて削除する必要があります)。

結果は、入力が負の場合は1、正の場合は0の値を持つintです。

ハイパーバイト(あなたのケースでは、DE)を取り出し、上半分(D)を書き出し、そのハイビットがゼロか1であることを確認します。

+0

+1エレガントでポータブルなソリューションです。 –

+0

...まだコンパイルと実行が必要です。 –

+0

また、ペーパーで行うこともできます。これは、数字よりも簡単なので、数値を書き出す必要はありません。 – Femaref

0

これを決めるには、幅(数値ビットの数)をintで知る必要があります。

また、フォーマット文字列の末尾に\nを付けて出力する必要があります。

3

タイプのビット深度に応じて、値が0x80,0x8000,0x80000000、または0x8000000000000000より小さいかどうかを確認してください。それより小さい場合は正、そうでない場合は負です。それを説明するために

int negative = (input >> ((sizeof(int) * 8) - 1)) & 0x01; 

:いくつかのビット単位の魔法で

1

最初のビット(符号ビット)が1の場合、値は負になります。それ以外の場合は正です。

ところで、正の数に比べてもう1つ負の数があります。

0

0xDEADBEEFはのシステムでINT_MAXより大きいため、intへの変換は実装定義です。一般的な2の補数の実装では、[INT_MIN,INT_MAX]の範囲内の減少モジュロ2*INT_MAX+2として定義されます。

関連する問題