3

我在倍增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;

这行得通吗?

4

3 回答 3

6

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

于 2011-05-08T00:59:46.927 回答
5

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

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

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

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

d = d >> 32;

也可以写成

d >>= 32;
于 2011-05-08T01:11:58.430 回答
1

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

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

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

输出00019A4D26950400

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

unsigned int upper;
unsigned int lower;

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

printf("upper: %08X lower: %08X\n", upper, lower);
于 2011-05-08T01:25:16.303 回答