相关疑难解决方法(0)

将 2 个字节转换为有符号的 16 位整数的正确方法是什么?

这个回答中zwol提出了这个主张:

将来自外部源的两个字节数据转换为 16 位有符号整数的正确方法是使用如下辅助函数:

#include <stdint.h>

int16_t be16_to_cpu_signed(const uint8_t data[static 2]) {
    uint32_t val = (((uint32_t)data[0]) << 8) | 
                   (((uint32_t)data[1]) << 0);
    return ((int32_t) val) - 0x10000u;
}

int16_t le16_to_cpu_signed(const uint8_t data[static 2]) {
    uint32_t val = (((uint32_t)data[0]) << 0) | 
                   (((uint32_t)data[1]) << 8);
    return ((int32_t) val) - 0x10000u;
}
Run Code Online (Sandbox Code Playgroud)

上述哪个函数合适取决于数组是包含小端还是大端表示。字节序是不是问题的问题,在这里,我很奇怪,为什么zwol减去0x10000uuint32_t值转换为int32_t

为什么这是正确的方法

转换为返回类型时如何避免实现定义的行为?

既然您可以假设 2 的补码表示,那么这个更简单的转换将如何失败: return (uint16_t)val;

这个幼稚的解决方案有什么问题:

int16_t le16_to_cpu_signed(const uint8_t data[static 2]) {
    return …
Run Code Online (Sandbox Code Playgroud)

c casting language-lawyer

33
推荐指数
4
解决办法
4263
查看次数

标签 统计

c ×1

casting ×1

language-lawyer ×1