gpt4 book ai didi

c++ - 了解位运算及其效果

转载 作者:行者123 更新时间:2023-11-27 23:43:39 25 4
gpt4 key购买 nike

我试图理解以下代码中位运算符的用途:

#define BIT8 unsigned char
#define BIT16 unsigned short
#define MEAN_SIZE (sizeof(BIT16) * 32)

void *Alloc16Address(void** pAlignedStart, unsigned long ulBytes) // ulBytes=2048
{
void *pBuffer = new BIT8 [ulBytes + 16];
*pAlignedStart = (void*)((((unsigned long)pBuffer >> 4) << 4) + 16);
return pBuffer;
}

稍后这段代码给出了访问冲突:

f(std::ostream& stream) 
{
BIT16* m_pMeans, x;
int iSize = 32;
x = (BIT16*) Alloc16Address((void**)&m_pMeans,MEAN_SIZE*iSize);
stream.read((char*)m_pMeans, MEAN_SIZE*iSize); // <<<< access volation
}

我知道耗尽文件可能会产生错误,但以前这适用于相同的代码和文件,唯一的变化是从我的旧 WIN7 机器转移到新的 WIN10 机器。至少我想排除按位操作线是罪魁祸首。此代码是否会受到某些环境变化的影响?

最佳答案

这与位运算符无关。问题是 unsigned long 在 64 位 Windows 上只有 32 位。代码可能在 WIN32 上运行正常。

改变:

*pAlignedStart = (void*)((((unsigned long)pBuffer >> 4) << 4) + 16);

到:

*pAlignedStart = (void*)((((uintptr_t)pBuffer >> 4) << 4) + 16);

关于c++ - 了解位运算及其效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52498036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com