6

非常に単純な質問ですが、何かを忘れているだけかもしれません。64 ビット Linux では、long は 8 バイトで正しいですか? その場合、64 番目のビットを設定したい場合は、次のようにします。

unsigned long num = 1<<63;

ただし、これをコンパイルすると、幅を超えて左にシフトしているというエラーが表示されます。また、long 型 (符号拡張なし) の最初の 32 ビットを取得したい場合は、次のようにすることができます。

num = num&0xFFFFFFFF;

またはどうですか:

num = (int)(num);

ありがとうございました。

4

5 に答える 5

4

実際、整数の正確な長さ (ビット単位) が必要な場合は、C99準拠のコンパイラを想定し、などの#include <stdint.h>型を使用します 。便利な型は、ポインタと同じビット数の整数型です (したがって、それは機械の「言葉」です)int64_tint32_tintptr_tvoid*

于 2012-04-06T07:22:08.307 に答える
1

移植性のために、次を使用できます。

制限.h

#define LNG_BIT   (sizeof(long) * CHAR_BIT)

unsigned long num = 1UL << (LNG_BIT - 1);

「 low int 」を取得するには、次のようにしますか?:

#define INT_BIT   (sizeof(int) * CHAR_BIT)

if (LNG_BIT > INT_BIT)
    return num & (~0UL >> INT_BIT);
else
    return num;

また

    num &= ~(~0U << INT_BIT);

または、マスクなどを使用します。 int ビットが必要な理由、目的などに大きく依存します。

また、コンパイラによって提供されるオプションにも注意してください。つまり、gcc を使用している場合:

-m32
-m64
-mx32
        32 ビットまたは 64 ビット環境用のコードを生成します。
        * -m32 オプションは、int、long、およびポインター型を 32 ビットに設定し、任意の i386 システムで実行されるコードを生成します。
        * -m64 オプションは、int を 32 ビットに、long 型とポインタ型を 64 ビットに設定し、x86-64 アーキテクチャ用のコードを生成します。Darwin の場合のみ、-m64 オプションは -fno-pic および -mdynamic-no-pic オプションもオフにします。
        * -mx32 オプションは、int、long、およびポインター型を 32 ビットに設定し、x86-64 アーキテクチャー用のコードを生成します。

-maddress-mode=longなどもあります。

-maddress-mode=long
        ロング アドレス モードのコードを生成します。これは、64 ビットおよび x32 環境でのみサポートされています。これは、64 ビット環境のデフォルトのアドレス モードです。

于 2012-04-06T09:19:13.777 に答える
0

最初の質問の問題は、コンパイラが '1' を長整数としてではなく整数として扱っていることだと思います。割り当てが終わるまで、それはわかりません。

次のようにして修正できます。

unsigned long num = (unsigned long)1<<63;
于 2012-04-06T06:53:58.920 に答える