首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么unsigned char的结果不是unsigned char <<

为什么unsigned char的结果不是unsigned char <<
EN

Stack Overflow用户
提问于 2012-01-03 22:10:06
回答 3查看 1.3K关注 0票数 7

我得到了左移位的结果,我找不到一个解释。

代码语言:javascript
复制
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

如何将无符号字符的位向左移位,以使位被截断,结果为1111 1110?

我试图做的是读取一系列字节,并将它们解释为不同长度(1-32位)的整数。

代码语言:javascript
复制
F0        F5
1111 0000 1111 0101 

可能是

代码语言:javascript
复制
0F (first 4 bits)
0F (next 8 bits)
05 (last 4 bits)

这是不是与这样一个事实有关,即运算不是用小于int的类型完成的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-03 22:16:14

引用2011年标准的一些草案:

5.8移位运算符expr.shift

..。

操作数应为整型或无作用域枚举类型,并执行整型升级。结果的类型是提升的左操作数的类型。

4.5集成促销conv.prom

如果int可以表示源类型的所有值,则整数转换秩(4.13)小于int的秩的整数类型( bool、char16_t、char32_t或wchar_t除外)的pr值可以转换为int类型的pr值;否则,源prvalue可以转换为unsigned int类型的pr值

..。

因此,value被提升为int,并且value << shift的类型是被提升的左操作数的类型,即int

您可以使用以下方法之一来实现您想要的结果:

代码语言:javascript
复制
std::cout << "result " << ((unsigned char)(value << shift)) << "\n";
std::cout << "result " << ((value << shift)&0xff) << "\n";
票数 9
EN

Stack Overflow用户

发布于 2012-01-03 22:16:11

只需将其转换回一个无符号字符:

代码语言:javascript
复制
std::cout << "result " << static_cast<unsigned char>(value << shift) << "\n";

或者,使用按位AND:

代码语言:javascript
复制
std::cout << "result " << ((value << shift) & 0xFF) << "\n";
票数 2
EN

Stack Overflow用户

发布于 2012-01-03 22:17:07

你可以屏蔽你感兴趣的部分:

代码语言:javascript
复制
(value << shift) & 0xff

您所看到的是整数提升的结果,并且是语言的一部分。想象一下,你从2个8位的整数组成一个16位的整数--你不会想手动提升到一个更高宽度的整数来把高位和低位放到正确的位置,对吧?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8713490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档