如果: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 >> 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++ 会发生啥的主要内容,如果未能解决你的问题,请参考以下文章