gpt4 book ai didi

c - 如何将 64 位数字转换为 8 位数字

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:57 25 4
gpt4 key购买 nike

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

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

我的做法是否正确?

最佳答案

uint64_t val = foo();

考虑以下 4 种方法,所有方法都表现良好,因为将值分配给无符号类型是明确定义的,即使该值超出目标范围也是如此。实际上,它是“目标类型的最大值加一”的欧几里德 mod

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


OP原文:没问题,就是有点啰嗦。只要 val 是某种整数类型,就允许使用 &

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

Actor ,没有面具。转换为 (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) 促进现在和 future 意图的清晰度。推荐,因为它清楚地传达了代码缩小范围 0-FF 值的意图

uint8_t var_nc = val & 0xFF;

作为第二选择,选择简单

uint8_t var = val;

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

--

次要问题:名称 valvar 过于通用。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com