【问题标题】:grabbing upper 4 bytes of a 8 byte word抓取 8 字节字的高 4 字节
【发布时间】:2011-05-08 00:57:43
【问题描述】:

我正在乘以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;

这行得通吗?

【问题讨论】:

  • 您使用的是什么操作系统和编译器?
  • 你想要 16 字节还是 8 字节?您的计算器结果显示 16 个十六进制数字,即 8 个字节,而不是 16 个。
  • 我认为他想要 8 个字节,但计数为 16 位。我相应地编辑了问题

标签: c++ c long-long


【解决方案1】:

在数字之后添加LL(例如3765450781LL),否则它们将被计算为ints,其余部分在分配给d之前被砍掉。

【讨论】:

  • 根据您的编译器,3765450781(没有LL)可能是int之外的另一种类型。不保证 32767 以上的数字适合 int。特别是,在许多合理的系统上,它将是unsigned int。
【解决方案2】:

您需要在常量之后使用LL 来获得long long,如MByD 的另一个答案所示。

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

在右移之前不需要屏蔽高 4 个字节,因为在进行右移时会以任何方式丢弃低 4 个字节。

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

d = d >> 32;

也可以写成

d >>= 32;

【讨论】:

  • 他想要>>32,因为他只想要高4个字节而不是8个
  • @drhirsch 是的,我刚刚意识到这一点。谢谢。只是考虑要移位的位数,忘记了 long long 只有 64 位。
【解决方案3】:

正如其他人指出的那样,您必须在 64 位数字文字后加上 LL。

要以十六进制打印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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2023-03-25
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    相关资源
    最近更新 更多