나는 바이트가 취할 수있는 가장 낮은 값이 왜 -128. 이진수 127이기 때문에 가장 높은 값이라는 것을 알 수 있습니다 01111111. 그러나 하나는 -1288 비트로 만 표현 되고 그중 하나는 부호에 사용됩니까? 양수 128은 이미 8 비트입니다. 즉 10000000, 음수 부호를 나타내려면 9 번째 비트가 필요합니다.
누군가 제게 이것을 설명해 주시겠습니까?
나는 바이트가 취할 수있는 가장 낮은 값이 왜 -128. 이진수 127이기 때문에 가장 높은 값이라는 것을 알 수 있습니다 01111111. 그러나 하나는 -1288 비트로 만 표현 되고 그중 하나는 부호에 사용됩니까? 양수 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 포함)이기 때문입니다.