如何将64位数字(0xffffffffffffff8c
)转换为8位数字(0x8c
)。我的代码:
uint64_t val = 0xffffffffffffff8c;
uint8_t var = (uint8_t) (val & 0x0000FF);
我这样做对吗?
最佳答案
uint64_t val = foo();
考虑下面4个方法,所有这些方法都表现良好,因为为无符号类型赋值是定义良好的,即使该值不在目标范围内。实际上,它是“一加上目标类型的最大值”的欧几里德模型。
注:掩模常数
0
中的前导0x0000FF
s不需要。根据需要使用前导零来表达清晰性。可以使用0xFF
或0x00000000000000FF
。OP的原话是:没问题,但有点冗长。只要
val
是某种整数类型,就允许&
。uint8_t var = (uint8_t) (val & 0x0000FF);
演员,没有面具。投射到
(uint8_t)
是0xFF
的掩码。一般来说,应该避免掩蔽,因为它在移植代码时有惊人的效果。当强制转换为无符号固定宽度类型(如本示例中所示)时,情况并非如此。uint8_t var_nm = (uint8_t) val;
面具,没有石膏。就像上面说的。值的缩小是显式编码的。
uint8_t var_nc = val & 0xFF;
没有演员,没有面具。这是有效的,但当使用学究式
[-Wconversion]
或等效的时,可能会产生如下警告。目前尚不清楚代码是否期望缩小范围。// warning: conversion to 'uint8_t {aka unsigned char}' from 'uint64_t
// {aka long long unsigned int}' may alter its value [-Wconversion]
uint8_t var_nc_nm = val;
编码的目标是1)完成功能2)合理高效3)现在和将来都促进意图的清晰。建议,因为它清楚地传达了代码缩小0-FF范围值的意图
uint8_t var_nc = val & 0xFF;
作为第二选择
uint8_t var = val;
希望生成相同的可执行代码。
--
次要:名称
val
和var
过于通用。关于c - 如何将64位数字转换为8位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40292903/