如果:char x = short y in c++ 会发生啥

Posted

技术标签:

【中文标题】如果:char x = short y in c++ 会发生啥【英文标题】:What happens if : char x = short y in c++如果:char x = short y in c++ 会发生什么 【发布时间】:2014-08-25 16:35:52 【问题描述】:

就像标题说的我有这个代码:

void Emulator::cpu16BitLoad(char& hi, char& lo)

    m_cyclesThisUpdate += 12;
    short n = readShort();
    m_programCounter += 2;
    lo = n;
    hi = n << 8;

我想知道我的变量 'lo' 是否会包含 n 的最后 8 位

【问题讨论】:

运行一下就知道了? 它是实现定义的。如果您使用unsigned char,您将在所有平台上获得一致的行为。 n 应该是 unsigned short 甚至更好的 uint16_t 应该是 hi = n &gt;&gt; 8; hi lo 应该是 uint8_t @MarcB:这将为您提供一个特定实现的答案。不幸的是,它不会告诉你它是否便携。 【参考方案1】:

根据标准部分 4.7 积分转换 [conv.integral]

1 一个整数类型的纯右值可以转换为另一个整数的纯右值 类型。无作用域的prvalue 枚举类型可以转换为整数类型的prvalue。

2 如果目标类型是无符号的,则结果值是最小的 与源整数一致的无符号整数(模 2n,其中 n 为 用于表示无符号类型的位数)。 [ 注意: 在一个 二进制补码表示,这种转换是概念性的, 位模式没有变化(如果没有截断)。 ——尾注 ]

3 如果目标类型是有符号的,如果可以的话,值不变 在目标类型中表示(和 位域宽度);否则,该值是实现定义的。

因此,假设目标类型是“char”,它实际上可以是有符号的(通常)或无符号的。在后一种情况下,编译器只需要取低八位。

IE 你应该这样写:

void load(unsigned char &lo)

    unsigned short val = /* get it somewhere */;
    lo = val;

【讨论】:

以上是关于如果:char x = short y in c++ 会发生啥的主要内容,如果未能解决你的问题,请参考以下文章

C语言中的unsigned char数组怎么转成unsigned short数组

C语言有没有个语句可以把short转换成char[]

c++ 中char&的理解

C/C++ 中char类型如何转化short?

DDL(数据定义语言)

c / c ++如何将short转换为char