2

私の質問は、アドレス空間の扱いに関するものです。

16 進数の 2 つのアドレス空間があります: 0x7fffff09 と 0x7fffff08。

それらが8または8バイトで割り切れるかどうかを知るにはどうすればよいですか? C または C++ コードでチェックがどのように見えるかのように。通常、通常の数値には mod を使用し、剰余がない場合は割り切れることを知っています。

編集:アドレス空間は__8、__16、__32(8ビット、16ビット、32ビット)にすることができます

4

4 に答える 4

7

8 バイト境界はアーキテクチャによって異なります。

割り切れる 8 バイトは単なるモジュロ演算です。ポインターを十分な大きさの int にコピーし、% 8 を実行します。

#include <stdint.h>
void *addr = ....
uintptr_t i = (uintptr_t)addr;
i = i % 8

もちろん、これを関数に入れることができます。

int isEightByteDivisible(const void *addr) {
    return ((uintptr_t)addr % 8) == 0
}

アラインメントの問題については、メンバーに関連する C/C++ 構造体のアラインメントの決定も参照してください。

于 2013-11-05T15:40:19.527 に答える
3

剰余演算子は%です。だから単純にテストする

addr % 8 == 0

アドレスがポインターの形式である場合は、ポインターを適切な符号なし整数型にキャストする必要があります。

于 2013-11-05T15:39:44.600 に答える
2

ビットごとの & 演算子を使用すると、すばやく実行できます。最初にキャストする必要がありますuintptr_t

bool isAligned(const void *ptr) {
    return !(((uintptr_t)ptr) & 7);
}
于 2013-11-05T15:48:19.197 に答える
1
if (addr % 8 == 0)
{
    //divisible by 8
}
else
{
    //not divisible by 8
}
于 2013-11-05T15:50:14.017 に答える