如何将64位数转换为8位

时间:2016-10-27 19:37:16

标签: c

如何将64位数字(0x8c)转换为8位数字(uint64_t val = 0xffffffffffffff8c; uint8_t var = (uint8_t) (val & 0x0000FF); )。我的代码:

sed 's/^[a-z]*,[a-z]*,/\U&/' file

我是以正确的方式做到的吗?

2 个答案:

答案 0 :(得分:3)

uint64_t val = foo();

考虑下面的4个方法,所有方法都表现良好,因为很好地定义了为无符号类型赋值,即使该值超出了目标的范围。实际上,它是“一加上目的地类型的最大值”的欧几里德 mod

注意:不需要掩码常量0中的前导0x0000FF。根据需要使用前导零来表达清晰度。可以使用0xFF0x00000000000000FF

OP的原创:没问题,但有点冗长。只要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;

期望生成相同的可执行代码。

-

次要:名称 valvar过于通用。

答案 1 :(得分:0)

您不需要&或演员表(尽管您可以保留它以使意图更清晰)。你可以在不同的整数类型之间隐式转换,对于无符号整数,溢出行为(=环绕,实际上归结为“只取低字节”这里)是很好定义的(并且在这里做你想要的)。