我必须使用section{
max-width:100%;
height:700px;
background-size:cover;
background-position:50% 50%;
background-repeat: no-repeat;
}
,val1
,val2
和val3
创建一个64字节的值。
输出应类似于:val4
,但我得到0xabcdabcd01000000
0x81000000
答案 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机器上,您也会得到不同的结果。