TSQL 按位非
TSQL BITWISE NOT
整数170的二进制表示是1 0 1 0 1 0 1 0
反转位给出 0 1 0 1 0 1 0 1
换算成十进制就是整数85.
为什么 SELECT ~170
return-171?
我很难理解我在这里缺少什么。
不是一个字节(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服务器中的整数类型是:
- tinyint: 字节(1 字节)(8 位)(无符号)
- smallint:字(2 字节)(16 位)(有符号)
- int:双字(4 字节)(32 位)(有符号)
- bigint: qword (8 bytes) (64 bits) (signed)
请注意,虽然我描述了带符号的字节,但看起来 SQL 服务器根本没有带符号的字节,也根本没有更大的无符号整数类型。因此,如果您使用 tinyint
,它将始终是无符号的,如果您使用任何更大的东西,它将始终是有符号的。
整数170的二进制表示是1 0 1 0 1 0 1 0
反转位给出 0 1 0 1 0 1 0 1
换算成十进制就是整数85.
为什么 SELECT ~170
return-171?
我很难理解我在这里缺少什么。
不是一个字节(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服务器中的整数类型是:
- tinyint: 字节(1 字节)(8 位)(无符号)
- smallint:字(2 字节)(16 位)(有符号)
- int:双字(4 字节)(32 位)(有符号)
- bigint: qword (8 bytes) (64 bits) (signed)
请注意,虽然我描述了带符号的字节,但看起来 SQL 服务器根本没有带符号的字节,也根本没有更大的无符号整数类型。因此,如果您使用 tinyint
,它将始终是无符号的,如果您使用任何更大的东西,它将始终是有符号的。