나는 바이트가 취할 수있는 가장 낮은 값이 왜 -128
. 이진수 127
이기 때문에 가장 높은 값이라는 것을 알 수 있습니다 01111111
. 그러나 하나는 -128
8 비트로 만 표현 되고 그중 하나는 부호에 사용됩니까? 양수 128은 이미 8 비트입니다. 즉 10000000
, 음수 부호를 나타내려면 9 번째 비트가 필요합니다.
누군가 제게 이것을 설명해 주시겠습니까?
나는 바이트가 취할 수있는 가장 낮은 값이 왜 -128
. 이진수 127
이기 때문에 가장 높은 값이라는 것을 알 수 있습니다 01111111
. 그러나 하나는 -128
8 비트로 만 표현 되고 그중 하나는 부호에 사용됩니까? 양수 128은 이미 8 비트입니다. 즉 10000000
, 음수 부호를 나타내려면 9 번째 비트가 필요합니다.
누군가 제게 이것을 설명해 주시겠습니까?
short
, int
하고 long
.
why java byte type is not a range of 0..255
? 사실 많은 사람들이이 질문을합니다. 대부분의 언어에서 byte
유형이 서명되지 않았습니다.하지만 자바 byte
에서도 서명이되어 있습니다. 저 (그리고 다른 많은 사람들)는 그것이 첫날부터 자바에 남아 있던 나쁜 디자인이라고 믿습니다. JNI를 작업 할 때 문제가 있으며 byte
원하는 이름을 0..255로 지정할 때 저를 믿으십시오 !
답변:
답은 2의 보수 입니다.
간단히 말해서 Java (및 대부분의 최신 언어)는 부호있는 크기 표현을 사용하여 부호있는 정수를 나타내지 않습니다. 즉, 8 비트 정수는 부호 비트 뒤에 7 비트 부호없는 정수가 오는 것이 아닙니다.
대신 음의 정수는 2의 보수라고하는 시스템으로 표현되어 하드웨어에서 더 쉽게 산술 처리 할 수 있으며 양의 0과 음의 0을 갖는 잠재적 모호성을 제거합니다. 음수 0을 제거하는 부작용은 범위 하단에 항상 하나의 추가 음수가 있다는 것입니다.
2의 보수 시스템의 또 다른 흥미로운 특성은 첫 번째 비트가 부호 표시기 (즉, 비트 1로 시작하는 모든 숫자가 음수 임)로 효과적으로 기능하지만 다음 7 비트는 자체적으로 부호없는 숫자로 해석되어서는 안된다는 것입니다. 부호 비트가 적용됩니다.
2의 보수는 그다지 복잡하지 않지만, 2의 보수가 무엇인지, 어떻게 그리고 왜 작동하는지에 대한 초기 이해를 얻는 것은 아마도 SO 답변의 범위를 벗어납니다. Wikipedia 기사로 시작하거나 더 많은 리소스에 대한 용어를 google.
-128에 대한 쿼리를 간단히 처리하기 위해 2의 보수 수를 생성하는 기본 아이디어는 숫자의 부호없는 형식을 취하고 모든 비트를 반전 한 다음 1을 더하는 것입니다. 따라서 unsigned 128은 10000000입니다. 반전하면 01111111이되고 1을 더하면 다시 10000000이됩니다. 따라서 2의 보수 시스템에서 10000000은 +128이 아니라 모호하지 않게 -128입니다. +128보다 크거나 같은 숫자는 음수의 형태로 모호하기 때문에 2의 보수 시스템을 사용하여 8 비트로 표현할 수 없습니다.
Two 's 보수는 다음과 같이 작동합니다.
바이트는 8 비트로 구성됩니다.
00000000은 0을 의미합니다.
11111111은 255를 의미합니다.
그러나 숫자가 그렇게 제시되면 결과 숫자가 양수인지 음수인지 구별하지 않습니다. 이러한 이유로 왼쪽의 비트가이 정보를 제공합니다. 왼쪽 0
에있는 비트가이면 위에있는 다른 비트의 값을 추가 할 수 있습니다 zero
. 비트가 1
이면 위에 추가를 시작해야합니다 -128
. 왼쪽에있는 비트는 2의 7 제곱이기 때문입니다.
예;
이 예에서 왼쪽의 비트는 1이며, -128의 맨 위에 다른 비트의 값을 더하고 있음을 의미합니다.
10000000 = -128 (-128 + 0)
10000001 = -127 (-128 + 1)
10000011 = -125 (-128 + 3)
10000111 = -121 (-128 + 7)
같은 비트이지만 이번에는 왼쪽의 비트가 0
. 이는 우리가 위에 추가하기 시작했음을 의미 0
합니다.
00000000 = 0 (0 + 0)
00000001 = 1 (0 + 1)
00000011 = 3 (0 + 3)
00000111 = 7 (0 + 7)
지금까지 괜찮다면 질문에 대한 답은
가능한 가장 작은 수
10000000 = -128
가능한 가장 큰 숫자
011111111 = 127
이것이 범위가 -128에서 127 사이 인 이유 입니다.
2의 보수를 얻지 않고 : 2 ^ 8 (바이트는 8 자리이고 2 개의 값 중 하나를 가질 수 있기 때문에) = 256, 따라서 바이트가 나타낼 수있는 가장 개별적인 값은 256입니다. 따라서 숫자 -128에서 -1을 나타내는 것은 다음과 같습니다. 우리 범위의 절반. 여기서 질문은 왜 최대 양수 값이 128이 아니라 127이라고 믿습니다. 이것은 숫자 0을 나타내야하기 때문에 0-127은 범위의 다른 128 가능성입니다.
음수를 사용할 수없는 부호없는 바이트와 같이 양수 값만 허용했다면 범위는 0-255가 될 것입니다. 256 개의 다른 값 (0 포함)이기 때문입니다.