gpt4 book ai didi

将 2 个 uint16_t 组合成 1 个 uint32_t

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

我有 2 个 uint16_t,我想组合成 1 个 32 位数字:

uint16_t var1 = 255; // 0000 0000 1111 1111
uint16_t var2 = 255; // 0000 0000 1111 1111

uint32_t var3 = (var1 << 16) + var2;

我希望 var3 为 0000 0000 1111 1111 0000 0000 1111 1111... 所以十进制为 16711935 但我得到 255(0000 0000 0000 0000 0000 0000 1111 1111)。

有什么想法吗?

谢谢

最佳答案

在某种程度上,这是平台相关的。在离我最近的系统上,我们得到了预期的结果,可以用一个简短的程序来演示:

#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>

int main()
{
uint16_t var1 = 255; // 0000 0000 1111 1111
uint16_t var2 = 255; // 0000 0000 1111 1111

uint32_t var3 = (var1 << 16) + var2;

printf("%#"PRIx32"\n", var3);
}

输出为 0xff00ff .

但是,您的 var1var2在任何算术之前进行正常整数提升。如您所见,如果提升的类型不能保存中间结果,部分计算可能会丢失。

您可以通过显式加宽 var1 来避免此问题算术之前:

    uint32_t var3 = ((uint32_t)var1 << 16) +  var2;

我系统上等效的失败程序是:

#include <stdint.h>
#include <inttypes.h>
#include <stdio.h>

int main()
{
uint16_t var1 = 255; // 00ff
uint16_t var2 = 255; // 00ff

uint64_t var3 = ((uint64_t)var1 << 32) + var2;

printf("%#"PRIx64"\n", var3);
}

这会产生 0x1fe而不是 0xff000000ff如果我不加宽 var1转换如图所示(因为在此系统上,<<32 恰好是 32 位无符号类型的空操作)。

关于将 2 个 uint16_t 组合成 1 个 uint32_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45355208/

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