首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TSQL BITWISE否

TSQL BITWISE否
EN

Stack Overflow用户
提问于 2017-10-14 20:27:14
回答 1查看 571关注 0票数 2

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

为什么SELECT ~170会返回-171?

我很难理解我在这里缺少的是什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中的整体类型如下:

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46749025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档