我已经好好看了一下,找不到类似的问题,如果之前被问过,请道歉.
我只是在玩类型和数字,我想知道是否可以保证以下行为.如果我将2个变量声明为
unsigned char BIT_8 = 0;
unsigned short int BIT_16 = 0xFF01;
Run Code Online (Sandbox Code Playgroud)
然后执行以下操作(暂时忽略C样式转换,除非这会影响它?)
cout << "BIT_16: " << BIT_16 << "\n";
cout << "BIT_8: " << (int)BIT_8 << "\n";
BIT_8 = BIT_16;
cout << "BIT_8 after: " << (int)BIT_8 << "\n";
BIT_8 = BIT_16 >> 8;
cout << "BIT_8 after shift: " << (int)BIT_8 << "\n";
Run Code Online (Sandbox Code Playgroud)
我得到了输出
BIT_16: 65281
BIT_8: 0
BIT_8 after: 1
BIT_8 after shift: 255
Run Code Online (Sandbox Code Playgroud)
是否保证如果我将16位类型转换为8位类型,则前导字节将丢失?或者它是不确定的,上面的结果是运气?
我无法弄清楚我在这里做错了什么,希望有人在这里可以启发我.
我有一个类Flags,这是一个非常简化的版本,但我声明了一个bitset
class Flags
{
private:
//List of 8 bits
std::bitset<8> _P;
public:
Flags();
}
Run Code Online (Sandbox Code Playgroud)
在我的构造函数上,我将其初始化为
Flags::Flags()
: _P(32ul)
{}
Run Code Online (Sandbox Code Playgroud)
但它不会编译并给我错误
错误C2668:'std :: bitset <_Bits> :: bitset':对重载函数的模糊调用
这是在VS2010 SP1 64位编译但作为32位程序
编辑
接受的答案是针对上述情况,但作为旁注,任何人都可以解释为什么当使用默认构造函数(它应该将它们全部初始化为零)时,它们并不都设置为零?
_p.to_ulong()
Run Code Online (Sandbox Code Playgroud)
返回1390560944,_p看起来像
[8](0,0,0,0,1,1,0,1)
Run Code Online (Sandbox Code Playgroud)