抓取 8 字节字的上 4 个字节

  • 本文关键字:字节 抓取 c++ long-long
  • 更新时间 :
  • 英文 :


我正在乘以0x1d400 * 0xE070381D .

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

当我尝试在 cpp 中实现它时,这就是我所拥有的。

long long d;
d = 3765450781 * 1d400;

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

我正在尝试隔离0x00019A4D的上部 4 个字节并将它们保存到另一个变量中。如何做到这一点?

如果我可以让乘法显示所有 8 个字节,我想做的是隔离上 4 个字节:

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

这行得通吗?

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

你需要在

常量之后使用LL作为long long,如MByD的另一个答案所示。

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

在右移之前,您不需要屏蔽上 4 个字节,因为当您进行右移时,您将以任何方式丢弃下 4 个字节。

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

d = d >> 32;

也可以写成

d >>= 32;

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

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

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

输出00019A4D26950400 .

要获取变量 d 的上限和下部 32 位(4 个字节),您可以执行以下操作:

unsigned int upper;
unsigned int lower;
upper = d >> 32;
lower = d & 0x00000000FFFFFFFF;
printf("upper: %08X lower: %08Xn", upper, lower);

相关内容

  • 没有找到相关文章

最新更新