私の質問は、アドレス空間の扱いに関するものです。
16 進数の 2 つのアドレス空間があります: 0x7fffff09 と 0x7fffff08。
それらが8または8バイトで割り切れるかどうかを知るにはどうすればよいですか? C または C++ コードでチェックがどのように見えるかのように。通常、通常の数値には mod を使用し、剰余がない場合は割り切れることを知っています。
編集:アドレス空間は__8、__16、__32(8ビット、16ビット、32ビット)にすることができます
私の質問は、アドレス空間の扱いに関するものです。
16 進数の 2 つのアドレス空間があります: 0x7fffff09 と 0x7fffff08。
それらが8または8バイトで割り切れるかどうかを知るにはどうすればよいですか? C または C++ コードでチェックがどのように見えるかのように。通常、通常の数値には mod を使用し、剰余がない場合は割り切れることを知っています。
編集:アドレス空間は__8、__16、__32(8ビット、16ビット、32ビット)にすることができます
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++ 構造体のアラインメントの決定も参照してください。
剰余演算子は%
です。だから単純にテストする
addr % 8 == 0
アドレスがポインターの形式である場合は、ポインターを適切な符号なし整数型にキャストする必要があります。
ビットごとの & 演算子を使用すると、すばやく実行できます。最初にキャストする必要がありますuintptr_t
:
bool isAligned(const void *ptr) {
return !(((uintptr_t)ptr) & 7);
}
if (addr % 8 == 0)
{
//divisible by 8
}
else
{
//not divisible by 8
}