2017-10-14 10 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이됩니다.

프로그래머 모드, 소수점 및 선택한 바이트보다 높은 값을 가진 창 계산기를 사용하여 직접 수행 할 수 있습니다. 170을 입력하고 NOT을 누르면 -171이 나오며 각각의 비트 표현을 보여줍니다.

부호있는 바이트 인 경우 1010 1010은 실제로 170이 아닐 수 있습니다. 부호있는 바이트로 -86이됩니다. 바이트 모드로 반전하면 예상대로 85가됩니다.

부호있는 비트 패턴과 부호없는 비트 패턴의 차이점에 유의하십시오. 부호있는 정수의 경우, 1으로 시작하는 숫자는 음수이고, 비트를 반전하고 하나를 더하면 음수의 절대 값을 얻을 수 있습니다. 당신이 그것을 반전 경우 1010 1010이 (바이트로) 양수를 제공하는 이유는

0000 0000 1010 1010 음수를 제공합니다 당신은 왜 그것을 반전하는 경우 : (Two's Complement 참조). 참고로

, SQL 서버에서 통합 유형은 :

  • 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 1 0 1 0 1 0 1이 십진수로 변환되면 65365는 -171이 아닙니다. – AAsk

+1

@AAsk '1111 1111 0101 0101'은 부호가있는 16 비트 정수로서 -171입니다. * 부호없는 * 16 비트 정수로 65365입니다. –

+0

고맙습니다. 그것은 저에게 무슨 일이 일어나고 있는지 더 잘 이해하게 해줍니다.그러나 TSL은 (알고있는 한 내가 알고 있듯이) INT를 부호가 있거나 부호없는 것으로 지정하는 기능이 없으므로 조금 이상합니다. – AAsk