2017-10-14 26 views
2

整数170のバイナリ表現である1 0 1 0 1 0 1 0 は10進数に変換0 1 0 1 0 1 0 1 は85TSQLビット単位のNOTビットを反転

なぜSELECT ~170 リターン-171整数で与えますか?

私はここで紛失しているものを理解するのに苦労しています。

+0

32ビット整数での操作を避けるには、SELECT〜CAST(170 AS tinyint);を試してください。 –

+0

ありがとう、それは私が期待した答え、すなわち、85を与える。 – AAsk

答えて

3

バイト(8ビット)ではなく、おそらく32ビットの数値です。

長さ(16,32、または64)に関係なく、先頭には0があります。 16ビットでは、これは次のようになります。

0000 0000 1010 1010は-171です。1111 1111 0101 0101になります。

これはプログラマーモード、小数点、および選択されたバイト以上のものを持つウィンドウの電卓でこれを自分で行うことができます。 170を入力してNOTを押すと-171が得られ、それぞれのビット表記が表示されます。

注意しなければならないもう1つの点は、符号付きバイトの場合、1010 1010は実際には170ではないということです。符号付きバイトの場合、-86になります。それをバイトモードで反転させると、期待通りに85が得られます。

符号付きビットパターンと符号なしビットパターンの違いにも注意してください。符号付き整数の場合、1で始まる数字は負であり、ビットを反転して1を加算することによって、その負の数の絶対値を取得します。 (参照:Two's Complement

をあなたはそれを反転場合、これは、なぜ(バイトなど)1010 1010は正の数を与えている、とあなたはそれを反転した場合、なぜ0000 0000 1010 1010は負の数を示します。参考

、SQL Serverの整数型は、次のとおり

  • TINYINT:バイト(1バイト)(8ビット)(符号なし)
  • SMALLINT:ワード(2バイト)( DWORD(4バイト)(32ビット)()符号付き
  • BIGINT:QWORD(16ビット)(
  • INT)署名されました8バイト)(64ビット)(符号付き)

私は符号付きバイトを記述していましたが、SQL Serverには符号付きバイトがまったくなく、符号なし整数型はまったくありません。したがって、tinyintを使用すると、常に符号なしとなり、大きいものを使用すると常に署名されます。

+0

それは15ビットを使用している、あなたが示唆するように0 0 0 0 0 0 0 1 0 1 0 1 0 1 0を得るだろう。ビットを反転すると、1 1 1 1 1 1 1 1 0 1 0 1 0 1小数に変換され、65365は-171ではありません。 – AAsk

+1

@AAsk'11111111 0101 0101'は符号付き16ビット整数として-171である。 *符号なし* 16ビット整数として、それは65365です。 –

+0

ありがとうございます。それは私に何が起きているのかをよりよく理解することができます。しかし、TSLは(わかっている限り)INTを符号付きまたは符号なしとして指定する機能を持っていないので、少し奇妙です。 – AAsk