我是移动位的新手,但我正在尝试调试以下代码段:
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位数据吗?
答案 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