The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a non-negative value, the value of the result is the integral part of the quotient of E1/2E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.
转换的时候不会全部放1,注意下面
这是 2000 的二进制表示
0100 1110 0010 0000
在缩短到
1 byte
的char
后,应该是保留后面的0010 0000
, 而这个数十进制表示就是32
首先你需要去看一本叫D&E的书. 再者, 这个锅应该摔给C语言.
C++在设计的时候就想要去兼容C语言, 所以char和int之间的隐式转换(没有任何编译错误警告)是C带来的. 而一个大于char最大值的int, 转化成char时, 这个行为应该是
未定义行为
. 具体就不要深究了, 你只需要知道这样写代码是不对的.PS:
楼上给你的解释, 只是一个特定编译器下的实现, 站在未定义行为的角度看, 不管任何编译器怎么实现, 他都是合法的.
我记得以前写程序用移位操作, 当时并不太清楚用有符号整数会出现什么后果, 结果后来程序在gcc下面跑的很好, 在vc下面就是不行. 直到后来看书, 后来所有的位运算都用
uint32_t
或者unint64_t
.The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a non-negative value, the value of the result is the integral part of the quotient of E1/2E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.