如何在c语言中截断地址
我正在用C写一个hextump函数 如何将给定的地址void*start截断为小于给定start参数的16的最大倍数? 有没有一个简单的方法可以做到这一点? 谢谢假设void*地址包含您的原始地址:如何在c语言中截断地址,c,C,我正在用C写一个hextump函数 如何将给定的地址void*start截断为小于给定start参数的16的最大倍数? 有没有一个简单的方法可以做到这一点? 谢谢假设void*地址包含您的原始地址: unsigned long int multiple = (unsigned long int)address/16; void *new_address = (void*)(16 * multiple;) 除以16将得到整数值 uintptr_t rounded = ((uintptr_t)
unsigned long int multiple = (unsigned long int)address/16;
void *new_address = (void*)(16 * multiple;)
除以16将得到整数值
uintptr_t rounded = ((uintptr_t)start) & ~0xF;
请注意,来自C99的uintptr\u t是一个无符号整数,保证足够大,可以在平台上保存指针
位移位将最低的4位置零,因此是16的倍数。@user2817587,我建议您使用它,但不要与“int”一起使用。改为使用无符号long。地址总是无符号的,这种转换很可能导致地址错误。在C++中,你会使用siZig?比如UnpTrtRT Stand和0xFU?对于已经以四个零位结尾的地址0x123F0,您想要什么?最佳解决方案。严格阅读OP的问题,您可能需要uintpttr_tstart-1&~0x0F ah-在直接减去1之前是否需要将start强制转换为char类型?
uintptr_t x = ((uintptr_t)addr) & ~((1 << 4) - 1);