Heim > Fragen und Antworten > Hauptteil
伊谢尔伦2017-04-17 13:10:09
转换的时候不会全部放1,注意下面
这是 2000 的二进制表示 0100 1110 0010 0000
在缩短到 1 byte
的 char
后,应该是保留后面的 0010 0000
, 而这个数十进制表示就是 32
PHP中文网2017-04-17 13:10:09
首先你需要去看一本叫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.