如何将64位数字(0x8c
)转换为8位数字(uint64_t val = 0xffffffffffffff8c;
uint8_t var = (uint8_t) (val & 0x0000FF);
)。我的代码:
sed 's/^[a-z]*,[a-z]*,/\U&/' file
我是以正确的方式做到的吗?
答案 0 :(得分:3)
uint64_t val = foo();
考虑下面的4个方法,所有方法都表现良好,因为很好地定义了为无符号类型赋值,即使该值超出了目标的范围。实际上,它是“一加上目的地类型的最大值”的欧几里德 mod 。
注意:不需要掩码常量0
中的前导0x0000FF
。根据需要使用前导零来表达清晰度。可以使用0xFF
或0x00000000000000FF
。
val
是某种整数类型,就允许&
。
uint8_t var = (uint8_t) (val & 0x0000FF);
施放,没有面具。转换为(uint8_t)
是0xFF
的掩码。在 general 中,应该避免屏蔽,因为它在移植代码时具有令人惊讶的效果。当转换为无符号固定宽度类型时,不是这样,只是在这个简单的例子中。
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
过于通用。
答案 1 :(得分:0)
您不需要&
或演员表(尽管您可以保留它以使意图更清晰)。你可以在不同的整数类型之间隐式转换,对于无符号整数,溢出行为(=环绕,实际上归结为“只取低字节”这里)是很好定义的(并且在这里做你想要的)。