TSQL BITWISE NOT

时间:2017-10-14 20:27:15

标签: sql sql-server bit

整数170的二进制表示为1 0 1 0 1 0 1 0 反转位给0 1 0 1 0 1 0 1 转换为十进制的是整数85。

为什么SELECT ~170 返回-171?

我很难理解我在这里缺少的东西。

1 个答案:

答案 0 :(得分:3)

它不是一个字节(8位),它可能是一个32位数字。

无论长度如何(16,32或64),它都将具有前导0。在16位这看起来像:

0000 0000 1010 1010变为1111 1111 0101 0101,即-171。

你可以使用带有编程模式,十进制和高于所选字节的任何东西的Windows计算器自己做。输入170并点击NOT,你得到-171,它会显示每个的位表示。

另一件需要注意的事情是1010 1010实际上不是170,如果它是一个带符号的字节。作为带符号的字节,它将是-86。如你所料,在字节模式下反转它会产生85.

还要注意有符号和无符号位模式之间的区别。位长度很重要,因为对于有符号整数,以1开头的数字是负数,并且通过反转位并添加一个来获得该负数的绝对值。 (见:Two's Complement

这就是为什么1010 1010(作为一个字节)如果你反转它给出一个正数,为什么0000 0000 1010 1010给出一个负数如果你反转它。

作为参考,SQL Server中的整数类型是:

  • tinyint :字节(1字节)(8位)(无符号)
  • smallint :字(2字节)(16位)(已签名)
  • int :dword(4字节)(32位)(签名)
  • bigint :qword(8字节)(64位)(已签名)

请注意,虽然我描述了有符号字节,但看起来SQL Server根本没有签名字节,并且根本没有更大的无符号整数类型。因此,如果您使用tinyint,它将始终是未签名的,如果您使用更大的内容,则会始终签名。