【问题标题】:2 chars to signed short2个字符签名短
【发布时间】:2016-03-14 13:15:14
【问题描述】:

我有两个 char 值 char_1char_2。现在我想将它们组合成一个 16 位有符号整数值,其中 char_1 包含 MSB 中的符号。

|SGN|位 6|位 5|位 4|位 3|位 2|位 1|位 0|位 7|位 6|位 5|位 4|位 3|位 2|位 1|位 0|

|符号 1 |字符 1 的其余部分 |字符 2 |

我的尝试是:

signed short s = (((int)char_1) << 8) & (int)char_2;

现在s 得到 0...

【问题讨论】:

  • 请注意,您对整数大小的隐含假设是不可移植的。考虑使用来自&lt;cstdint&gt; 的固定宽度类型std::int8_tstd::int16_t
  • 可移植假设signed char 将能够保存带符号的 8 位数量,并且可移植假设 short 将保存带符号的 16 位数量。

标签: c++ char integer signed


【解决方案1】:

您需要按位 or 而不是 and

(((int)char_1) << 8) | (int)char_2;

由于您还要处理位,因此您可能也应该使用无符号类型(无符号字符、无符号整数、无符号短)。

【讨论】:

  • 我是个傻瓜。谢谢!
  • char_2 的演员表必须是(unsigned int)。如果 char 在您的平台上签名,并且 char_1, char_2 == 1,0xff,那么您最终将得到 (1
【解决方案2】:

工会可能会实现更清洁的解决方案。

typedef union { short int s; char c[2];} Data;

int main (){
        Data d;
        d.c[0]=char_2;
        d.c[1]=char_1;
}

注意:这对您来说可能不够便携,因为索引的顺序取决于架构字节序。我的示例在小端架构(即 Intel 0x86)上运行良好,但大端架构会打印 char_2 char_1

【讨论】:

    猜你喜欢
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2017-09-17
    • 1970-01-01
    • 2012-05-04
    • 2010-10-18
    • 1970-01-01
    相关资源
    最近更新 更多