整数170のバイナリ表現である1 0 1 0 1 0 1 0
は10進数に変換0 1 0 1 0 1 0 1
は85TSQLビット単位のNOTビットを反転
なぜSELECT ~170
リターン-171整数で与えますか?
私はここで紛失しているものを理解するのに苦労しています。
整数170のバイナリ表現である1 0 1 0 1 0 1 0
は10進数に変換0 1 0 1 0 1 0 1
は85TSQLビット単位のNOTビットを反転
なぜSELECT ~170
リターン-171整数で与えますか?
私はここで紛失しているものを理解するのに苦労しています。
バイト(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の整数型は、次のとおり
私は符号付きバイトを記述していましたが、SQL Serverには符号付きバイトがまったくなく、符号なし整数型はまったくありません。したがって、tinyint
を使用すると、常に符号なしとなり、大きいものを使用すると常に署名されます。
それは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
@AAsk'11111111 0101 0101'は符号付き16ビット整数として-171である。 *符号なし* 16ビット整数として、それは65365です。 –
ありがとうございます。それは私に何が起きているのかをよりよく理解することができます。しかし、TSLは(わかっている限り)INTを符号付きまたは符号なしとして指定する機能を持っていないので、少し奇妙です。 – AAsk
32ビット整数での操作を避けるには、SELECT〜CAST(170 AS tinyint);を試してください。 –
ありがとう、それは私が期待した答え、すなわち、85を与える。 – AAsk