使用不同的值创建64位结果

时间:2018-11-13 22:04:30

标签: c

我必须使用section{ max-width:100%; height:700px; background-size:cover; background-position:50% 50%; background-repeat: no-repeat; }val1val2val3创建一个64字节的值。 输出应类似于:val4,但我得到0xabcdabcd01000000

0x81000000

2 个答案:

答案 0 :(得分:4)

要创建64位值:

1)当结果超过32位时,确保使用64位操作数进行移位。

val1<<31    
(uint64_t) val1 << 31

2)移位32位而不是31位以实现NNNNNNNNxyz的目标

3)避免使用指针技巧。

uint8_t final_val[8];
// uint64_t *ptr = (uint64_t *)ADDR ;
uint64_t u64 = (uint64_t) val1 << 32 | val2 << 24 | val3 <<16 | val4;
memcpy(final_val, &u64, sizeof final_val);

4)使用匹配的printf说明符。

#include <inttypes.h>
//            v---- Not x, x is for unsigned
// printf("0x%x\n", u64);
printf("0x%" PRIx64 "\n", u64);
//           ^----^ from inttypes.h

答案 1 :(得分:2)

除第一个移位术语外的每个移位术语均被评估为int;第一个被评估为uint32_t,可能是unsigned int。然后将这些结果或放在uint32_t中或一起,然后分配给您的64位结果。

您至少需要将第一个移位执行为64位计算:

*ptr = (uint64_t)val1 << 32 | val2 << 24 | val3 << 16 | val4;

这可以移位32(根据需要,而不是以前的31),因为移位小于操作数(uint64_t)的大小。以前,您不能使用32,因为会被告知变化太大。

您可能更喜欢对称性:

*ptr = (uint64_t)val1 << 32 | (uint64_t)val2 << 24 | (uint64_t)val3 << 16 | (uint64_t)val4;

您的打印也有问题。您应该使用<inttypes.h>中的宏来指定uint64_t值的格式:

printf("%p  0x%" PRIx64 "\n", ptr, *ptr);

请注意,如果您使用unsigned long long *ptr等,则将使用0x%llx

使用final_val充其量也是可疑的。如果final_val对于64位类型未正确对齐(未在64位边界上对齐),则可能在某些计算机类型上崩溃。在所示的代码中,您应该简单地使用uint64_t变量作为指针的目标(因为所示的代码不使用final_val)。如果由于某种原因确实需要使用uint8_t值数组,那么有更好的方法来加载数据。在little-endian和big-endian机器上,您也会得到不同的结果。