整数170的二进制表示形式是1 0 1 0 1 0 1 0,反转位给转换为十进制的0 1 0 1 0 1 0 1是整数85。
为什么SELECT ~170会返回-171?
我很难理解我在这里缺少的是什么。
发布于 2017-10-14 20:32:40
它不是一个字节(8位),它可能是一个32位数字.
不管长度(16、32或64)是多少,它都会有领先的0s。
0000 0000 1010 1010变为1111 1111 0101 0101,即-171。
您可以自己使用带有程序员模式的windows计算器、十进制,以及所选的任何高于字节的方式来完成此操作。输入170并点击NOT,您将得到-171,它将显示每个位的表示形式。
另外要注意的是,如果1010 1010是一个有符号的字节,那么它实际上并不是170。作为一个有符号的字节,它将是-86。如您所料,在字节模式下将其转换为85。
还请注意有符号和无符号位模式之间的差异。位长很重要,因为对于有符号整数,以1开头的数字是负的,通过反转位并添加一个,得到这个负数的绝对值。(见:二补)
这就是为什么1010 1010 (作为一个字节)如果倒置它就会给出一个正数,如果你倒置它,0000 0000 1010 1010就会给出一个负数。
作为参考,Server中的整体类型如下:
请注意,虽然我描述了有符号字节,但它看起来像Server根本没有有符号字节,而且根本没有更大的无符号整数类型。因此,如果您使用tinyint,它将始终是无符号的,如果您使用任何更大的,它将始终被签名。
https://stackoverflow.com/questions/46749025
复制相似问题