2016-09-29 1 views
1

저는 스칼라를 처음 사용합니다. 나는 그것이 -128를 포함 할 수 있습니다 Byte 종류인지 이상한 사실을 발견했습니다하지만스칼라 바이트 유형에는 -128을 포함 할 수 있지만 128은 포함 할 수 없습니다.

scala> val overflow1NegByte = -129:Byte 
<console>:11: error: type mismatch; 
found : Int(-129) 
required: Byte 
     val overflow1NegByte = -129:Byte 
          ^

scala> val overflow1NegByte = -128:Byte 
overflow1NegByte: Byte = -128 

scala> val overflow1PosByte = 128:Byte 
<console>:11: error: type mismatch; 
found : Int(128) 
required: Byte 
     val overflow1PosByte = 128:Byte 
          ^

scala> val overflow1PosByte = 127:Byte 
overflow1PosByte: Byte = 127 

128은 분명히이 음수를 나타 내기 위해, 느낀다, 첫 번째 플래그가 사용됩니다. 양수의 경우에도이 플래그는 예약되어 있습니다. 이해할 수 있습니다. 그러나, 왜 긍정적 인 것보다 하나 더 부정적인 숫자.

+0

아주 간단한 답 : 모두 -128과 128은 (0 포함) 2 * 128 + 1 = 257 개 번호가 당신에 의해에 집어 넣은 싶어 te, 이는 단지 8 비트, 즉 256 개의 조합을 갖는다. 128 또는 -128 중 하나를 희생해야합니다. 왜 128입니까? 조금 더 긴 이야기입니다. –

+0

REPL로 이동하여 'Byte','Short','Int' 및'Long'의 정수 유형 각각에 대해'MinValue' 및 'MaxValue'를 호출합니다. (즉, Byte.MinValue, Byte.MaxValue, Short.MinValue 등)이 패턴이 일관성이 있음을 알 수 있습니다. – jwvh

답변

2

the range of a Byte on the JVM이기 때문에 :

byte는 : 바이트 데이터 형식은 8 비트는 2의 보수 부호있는 정수입니다. 최소값은 -128이고 최대 값은 127 (포함)입니다.

설명했듯이, 이것은 Two's Complement이기 때문입니다.

좀 더 설명해 보겠습니다. 바이트는 8 비트를 유지하고, 우리가 숫자 -128을 나타 내기 원한다면. 우리는 128에서 시작 :

10000000 

그리고 우리는 비트를 반전 :

01111111 

을 그리고 우리는 다시 얻을 1. 추가 : -128이 표시되는 방법이

10000000 

입니다. 동등

01111111 

가 127이의 보수는 부호를 표현하기 위해 MSB (최상위 비트)를 사용한다는 사실에 정렬 : 이것은 우리의 보수로 나타낼 수있는 가장 큰 서명 수 있음을 의미합니다. wikipedia 가입일

:

범위의 모든 정수 나타낼 수

N 비트의 보수 기수법 - (2N - 1) +에 (2N - 1 - 1)

을 그래서

, 우리는이 :

-(2^7-1) = (-128) to +(2^7-1 - 1) = +(127) 
+0

확인. 그러나 왜 긍정적 인 숫자보다 하나 더 부정적인 것인가. 같은 수의 양수와 음수를 포함해야합니다. –

+0

@ArnabDas 업데이트 된 답변보기 –

+0

감사합니다. @YuvalItzchakov. 아주 좋은 설명. –

관련 문제