我乘以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;
这会有用吗?
答案 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);