抓取8字节字的高4字节

时间:2011-05-08 00:57:44

标签: c++ c long-long

我乘以0x1d400 * 0xE070381D

当我在计算器上执行此操作时,结果为0x00019A4D26950400

当我尝试在cpp中实现这个时,我就拥有了。

long long d;

d = 3765450781 * 1d400;

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

我试图隔离高4字节0x00019A4D并将它们保存到另一个变量中。怎么办呢?

如果我可以得到乘法来显示所有8个字节,我想要做的就是隔离上面的4个字节:

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

d = d>>8;

这会有用吗?

3 个答案:

答案 0 :(得分:6)

在数字后添加LL(例如3765450781LL),否则它们将被计算为int s,其余部分会在分配到d之前被删除。

答案 1 :(得分:5)

你需要在LL的常量之后使用long long,如MByD的另一个答案中所示。

此外,您的数据类型应为unsigned long long。当您右移时,由于符号扩展,您可能会重复最左边的位。 (这取决于机器,但大多数机器标志在右移时会延长负数。)

在右移之前你不需要屏蔽高4字节,因为当你做右移时你将以任何方式丢弃低4字节。

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

d = d >> 32;

也可以写成

d >>= 32;

答案 2 :(得分: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);