3

我是移位新手,但我正在尝试调试以下代码段:

if (!(strcmp(arr[i].GetValType(), "f64")))
 {
        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;
     dem_content_buff[BytFldPos + 4] = tmp_data >> 32;
     dem_content_buff[BytFldPos + 5] = tmp_data >> 40;
     dem_content_buff[BytFldPos + 6] = tmp_data >> 48;
     dem_content_buff[BytFldPos + 7] = tmp_data >> 56;
        }    

我收到一条警告,说“32”到“56”的行的班次计数太大。谓词中的“f64”只是表示数据应该是64位数据。

这应该怎么做?

编辑:

我应该把更多的代码放进去。

tmp_data = simulated_data[index_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"))) { 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; dem_content_buff[BytFldPos + 4] = tmp_data >> 32; dem_content_buff[BytFldPos + 5] = tmp_data >> 40; dem_content_buff[BytFldPos + 6] = tmp_data >> 48; dem_content_buff[BytFldPos + 7] = tmp_data >> 56; }

所以,dem_content_buff现在只保存整数。我也不能将此数组用于 64 位数据吗?

4

4 回答 4

2

是什么类型的tmp_data

我的猜测是tmp_data只有 32 位,因此是错误的。它将需要是 64 位无符号整数,这可以使用非标准(但得到良好支持)unsigned long long数据类型来实现。

于 2010-03-15T18:14:08.223 回答
1

确保按照在 unsinged long long 工作之前的建议对 tmp_data 使用 64 位 long 类型,但请检查您的编译器和体系结构文档。

代码应如下所示。此外,请确保您的 demp_content_buff 声明为 unsigned char * 或 unsigned char []。

然后将您的代码更改为:

if (!(strcmp(arr[i].GetValType(), "f64")))
    {
        dem_content_buff[BytFldPos] =  ( tmp_data & 0xff );
        dem_content_buff[BytFldPos + 1] =  (tmp_data >> 8 ) & 0xff ;
        dem_content_buff[BytFldPos + 2] =  (tmp_data >> 16) & 0xff ;
        dem_content_buff[BytFldPos + 3] =  (tmp_data >> 24) & 0xff;
        dem_content_buff[BytFldPos + 4] =  (tmp_data >> 32) & 0xff;
        dem_content_buff[BytFldPos + 5] =  (tmp_data >> 40) & 0xff;
        dem_content_buff[BytFldPos + 6] =  (tmp_data >> 48) & 0xff;
        dem_content_buff[BytFldPos + 7] =  (tmp_data >> 56) & 0xff;
        }   
于 2010-03-15T18:20:55.177 回答
1

要使移位运算符工作超过 32 位,tmp_data需要是 64 位类型 - 正如其他几个答案所示。

但是,您还希望simulated_data成为某个 64 位类型的数组,否则当您分配其原始值时,最高有效位tmp_data将始终为零(或符号扩展的一组1位):

tmp_data = simulated_data[index_data];
于 2010-03-15T18:29:26.583 回答
1

如果您使用的是 Visual Studio,请确保将 tmp_data 定义为:

__int64 tmp_data;              // Visual studio version

代替

unsigned long long tmp_data;   // GCC version
于 2010-03-15T18:30:35.677 回答