C ++ 64位问题

时间:2010-03-15 20:16:41

标签: c++ 64-bit bit-manipulation

我有以下代码:

tmp_data = simulated_data[index_data];
unsigned char *dem_content_buff;
dem_content_buff = new unsigned char [dem_content_buff_size];
int tmp_data;
unsigned long long tmp_64_data;

if (!(strcmp(dems[i].GetValType(), "s32")))
{
    dem_content_buff[BytFldPos] = tmp_data;
    dem_content_buff[BytFldPos + 1] = tmp_data >> 8;
    dem_content_buff[BytFldPos + 2] = tmp_data >> 16;
    dem_content_buff[BytFldPos + 3] = tmp_data >> 24;      
}

if (!(strcmp(dems[i].GetValType(), "f64")))
{
    tmp_64_data = simulated_data[index_data];
    dem_content_buff[BytFldPos] = tmp_64_data;
    dem_content_buff[BytFldPos + 1] = tmp_64_data >> 8;
    dem_content_buff[BytFldPos + 2] = tmp_64_data >> 16;
    dem_content_buff[BytFldPos + 3] = tmp_64_data >> 24;
    dem_content_buff[BytFldPos + 4] = tmp_64_data >> 32;
    dem_content_buff[BytFldPos + 5] = tmp_64_data >> 40;
    dem_content_buff[BytFldPos + 6] = tmp_64_data >> 48;
    dem_content_buff[BytFldPos + 7] = tmp_64_data >> 56;
}       

当第二个if语句为true并执行时,我在应用程序的其他位置出现了一些奇怪的内存错误。当我注释掉第二个if语句时,问题正常。所以我怀疑我对64位数据进行按位运算的方式是不正确的。

任何人都可以在此代码中看到任何需要更正的内容吗?

4 个答案:

答案 0 :(得分:2)

我怀疑dem_content_buff_sizeBytFldPos之间的互动。如果不符合以下条件:

assert(dem_content_buff_size > (BytFldPos + 7));

然后你将溢出你的缓冲区。

答案 1 :(得分:1)

看起来很好 - 从我能看到的。在执行之前检查BytFldPos范围是个好主意。

答案 2 :(得分:1)

我会检查dem_content_buff_size对于64位数字是否足够大,并且BytFldPos+7总是位于数组范围内。

答案 3 :(得分:0)

dem_content_buff数组的每个元素都是unsigned char。您要为每个此类元素分配long long。这是你的意图吗?

如果没有,它可能会导致数据损坏,因为转换会(或可能)失去价值。