为什么无符号字符的结果<<无符号字符不是无符号字符
Why result of unsigned char << unsigned char is not unsigned char
我得到左移的结果,我找不到一个解释。
unsigned char value = 0xff; // 1111 1111
unsigned char = 0x01; // 0000 0001
std::cout << "SIZEOF value " << sizeof(value) << "n"; // prints 1 as expected
std::cout << "SIZEOF shift " << sizeof(shift) << "n"; // prints 1 as expected
std::cout << "result " << (value << shift) << "n"; // prints 510 ???
std::cout << "SIZEOF result " << sizeof(value << shift) << "n"; // prints 4 ???
我期望结果是1111 1110
,但我得到的是int
(?),值为1 1111 1110
。
如何将unsigned char的位向左移动,使位被截断,结果为1111 1110?
我要做的是读取一系列字节并将它们解释为不同长度的整数(1-32位)。
F0 F5
1111 0000 1111 0101
可能0F (first 4 bits)
0F (next 8 bits)
05 (last 4 bits)
这是否与小于int的类型不能进行算术运算有关?
引用2011年标准草案:
5.8 Shift操作符[expr.shift]
…
操作数必须为整型或无作用域枚举类型,并执行整型提升。操作结果的类型为提升后的左操作数的类型。
和
4.5积分促销[conv.prom]
非bool、char16_t、char32_t或wchar_t的整型右值如果int可以表示所有,则可以将其转换为int类型的右值源类型的值;否则,源右值可以转换为unsigned类型的右值int
…
因此,value
升格为int
, value << shift
的类型为升格后的左操作数的类型,即int
。
你可以通过以下方式之一达到你想要的结果:
std::cout << "result " << ((unsigned char)(value << shift)) << "n";
std::cout << "result " << ((value << shift)&0xff) << "n";
将其转换回unsigned char:
std::cout << "result " << static_cast<unsigned char>(value << shift) << "n";
或者,使用bit - and:
std::cout << "result " << ((value << shift) & 0xFF) << "n";
您可以屏蔽您感兴趣的位:
(value << shift) & 0xff
你看到的是整数提升的结果,是语言的一部分。想象一下,你正在将2个8位的整数组合成一个16位的整数——你不会想要手动提升到一个更宽的整数来把高位和低位放到正确的位置,对吧?
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无符号字符打印其 ASCII 值
- 字符数组到无符号字符 *
- 是否可以在 c++ 中将两位数保存在无符号字符中