C ++移位

时间:2010-03-15 18:10:34

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

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

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 个答案:

答案 0 :(得分:2)

tmp_data的类型是什么?

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

答案 1 :(得分:1)

确保为tmp_data使用64位长类型,如在unsinged long 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;
        }   

答案 2 :(得分:1)

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

但是,您还希望simulated_data是一个64位类型的数组,否则tmp_data将始终为零(或符号扩展的1位集合)分配原始值时最重要的位:

tmp_data = simulated_data[index_data];

答案 3 :(得分:1)

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

__int64 tmp_data;              // Visual studio version

而不是

unsigned long long tmp_data;   // GCC version
相关问题