如何将64位数字(0xffffffffffffff8c)转换为8位数字(0x8c)。我的代码:

uint64_t val = 0xffffffffffffff8c;
uint8_t var = (uint8_t) (val & 0x0000FF);

我这样做对吗?

最佳答案

uint64_t val = foo();

考虑下面4个方法,所有这些方法都表现良好,因为为无符号类型赋值是定义良好的,即使该值不在目标范围内。实际上,它是“一加上目标类型的最大值”的欧几里德模型。
注:掩模常数0中的前导0x0000FFs不需要。根据需要使用前导零来表达清晰性。可以使用0xFF0x00000000000000FF
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;

希望生成相同的可执行代码。
--
次要:名称valvar过于通用。

关于c - 如何将64位数字转换为8位,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40292903/

10-12 01:27