찾다

 >  Q&A  >  본문

c++缩小转换的时候int变量赋值给char变量重输出时为什么是32?

巴扎黑巴扎黑2805일 전578

모든 응답(2)나는 대답할 것이다

  • 伊谢尔伦

    伊谢尔伦2017-04-17 13:10:09

    转换的时候不会全部放1,注意下面
    这是 2000 的二进制表示 ‭0100 1110 0010 0000‬
    在缩短到 1 bytechar 后,应该是保留后面的 0010 0000‬ , 而这个数十进制表示就是 32

    회신하다
    0
  • PHP中文网

    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.

    회신하다
    0
  • 취소회신하다