我正在尝试通过以下代码了解按位运算符的用途:
SELECT SUM(AMN)
OVER (PARTITION BY ID
ORDER BY DATE RANGE BETWEEN INTERVAL '100' DAY(3) PRECEDING
AND CURRENT ROW) S1
FROM ddd
此代码之后出现访问冲突:
#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;
}
我知道用尽文件可能会产生错误,但是以前这适用于相同的代码和文件,唯一的变化是从旧的WIN7计算机迁移到新的WIN10计算机。至少我想排除按位操作线是罪魁祸首。这段代码能否受某些环境变化的影响?
答案 0 :(得分:3)
与按位运算符无关。问题是unsigned long
在64位Windows上只有32位。该代码可能在WIN32上运行正常。
更改:
*pAlignedStart = (void*)((((unsigned long)pBuffer >> 4) << 4) + 16);
收件人:
*pAlignedStart = (void*)((((uintptr_t)pBuffer >> 4) << 4) + 16);