抓取8字节字的高4字节

jpr*_*e14 3 c c++ long-long

我在倍增0x1d400 * 0xE070381D.

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

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

long long d;

d = 3765450781 * 1d400;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

d = d>>8;
Run Code Online (Sandbox Code Playgroud)

这会有用吗?

MBy*_*ByD 6

LL在数字之后添加(例如3765450781LL)否则它们被计算为ints并且其余部分在分配之前被切断d.


Joe*_*Lee 5

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

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

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

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

d = d >> 32;
Run Code Online (Sandbox Code Playgroud)

哪个也可以写成

d >>= 32;
Run Code Online (Sandbox Code Playgroud)