如果出现以下情况:char x = c ++中的short y

时间:2014-08-25 16:35:53

标签: c++ types char short

就像标题所说我有这段代码:

void Emulator::cpu16BitLoad(char& hi, char& lo)
{
    m_cyclesThisUpdate += 12;
    short n = readShort();
    m_programCounter += 2;
    lo = n;
    hi = n << 8;
}

我想知道我的变量&#39; lo&#39;将包含n

的最后8位

1 个答案:

答案 0 :(得分:2)

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

  

1 整数类型的prvalue可以转换为另一个整数的prvalue   类型。一个没有眼镜的prvalue   枚举类型可以转换为整数类型的prvalue。

     

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

     

3 如果目标类型已签名,则值可以保持不变   以目的地类型表示(和   位域宽度);否则,该值是实现定义的。

因此,鉴于目标类型是“char”,它实际上可以签名(通常)或未签名。在后一种情况下,编译器只需要取低位八位。

IE你应该这样写:

void load(unsigned char &lo)
{
    unsigned short val = /* get it somewhere */;
    lo = val;
}