就像标题所说我有这段代码:
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位答案 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;
}