2011-05-08 51 views
3

我乘以0x1d400 * 0xE070381D抓取一个8字节字的高4字节

当我这样做对我的计算结果是0x00019A4D26950400

当我试图在CPP实施这一这里就是我有。

long long d; 

d = 3765450781 * 1d400; 

该代码给出的结果是d = 0x26950400。 这只是底部的4个字节,其他一切发生了什么?

我想隔离上面的4个字节0x00019A4D并将它们保存到另一个变量中。如何才能做到这一点?

如果我能得到的乘积来显示所有8个字节我在想什么做隔离上的4个字节的是:

d = d & 0xFF00; //0xFF00 == (binary) 1111111100000000 

d = d>>8; 

将这项工作?

+0

您使用的是什么操作系统和编译器? – 2011-05-08 01:11:02

+0

你想要16个字节还是8个字节?你的计算器结果显示16个十六进制数字,它是8个字节,而不是16个。 – 2011-05-08 01:18:06

+0

我认为他想要8个字节,但是计算了16个数字。我编辑了相应的问题 – hirschhornsalz 2011-05-08 01:26:17

回答

6

(例如3765450781LL)否则它们被计算为int s,并且其余部分被分配给d之前切掉后的数字添加LL

+0

根据您的编译器,3765450781(不带'LL')可能是'int'之外的另一种类型。不能保证32767以上的数字符合'int'。特别是在许多合理的系统中,它将是一个'unsigned int'。 – MSalters 2011-05-09 09:34:39

5

您需要在long long的常数后面使用LL,如MByD的另一个答案所示。

另外,你的数据类型应该是unsigned long long。在右移时,由于符号扩展,您可能会重复最左边的位。 (这是机器相关的,但大多数机器签名在右移时扩展负数)。

在右移之前,您不需要屏蔽掉高4字节,因为您要扔掉低4字节当你做正确的转变时。

最后,请注意>>的参数是的位数,而不是字节。因此,你要

d = d >> 32; 

这也可以写成

d >>= 32; 
+0

他想要>> 32,因为他只想要高4个字节而不是8 – hirschhornsalz 2011-05-08 01:27:44

+0

@drhirsch是的,我刚刚意识到这一点。谢谢。只是在考虑位数的变化,并忘记长期只有64位。 – 2011-05-08 01:28:25

1

正如有人指出,你必须用LL后缀您的64位数字文字。

要打印long long变量以十六进制,使用格式说明"%016llX"

long long d; 
d = 3765450781LL * 0x1d400LL; 
printf("%016llX\n", d); 

输出00019A4D26950400

为了得到变量d的上,下32位(4个字节),你可以这样做:

unsigned int upper; 
unsigned int lower; 

upper = d >> 32; 
lower = d & 0x00000000FFFFFFFF; 

printf("upper: %08X lower: %08X\n", upper, lower); 
相关问题