2012-05-03 2 views

답변

4

-1을 부호있는 바이트로 저장하는 데 사용 된 실제 메모리를 보면 0xff이라는 것을 알 수 있습니다. 그러나 이진 표현보다는 언어 자체에서 0xff이 단순히 한 바이트의 범위를 벗어납니다. -1의 2 진 표현은 실제로 2의 보수를 사용하지만 구현 세부 사항으로부터 보호됩니다.

언어 디자이너는 -128에서 127까지만 유지할 수있는 데이터 형식에 255를 저장하려고하면 오류로 간주해야한다는 입장을 간단하게 나타냅니다. 자바가 있습니다 이유

당신은 코멘트 요청 :

int i = 0xffffffff; 

문자 적 ​​0xffffffffint 문자이며 2의 보수를 사용하여 해석됩니다. 바이트에 대해 비슷한 작업을 수행 할 수없는 이유는 리터럴 형식이 byte이거나 실제로 short이라는 구문을 제공하지 않기 때문입니다.

더 많은 리터럴 유형을 제공하지 않기로 한 결정이 만들어진 이유를 모르겠습니다. 나는 그것이 단순성의 이유로 만들어진 것이라고 기대한다. 언어의 목표 중 하나는 불필요한 복잡성을 피하는 것이 었습니다.

+0

구현이 2를 보완 해 주셔서 감사합니다. 그런데 왜 언어가 int에 0xffff_ffff를 허용합니까? – Sridhar

1

유효하지만 범위를 벗어 났으므로 명시 적으로 바이트 (byte) 0xff로 캐스팅해야합니다.

0

-128에서 127

byte 범위에 사용할 수있는 값이이 범위를 벗어나는 값을 변수에 할당 할 수 있도록하고, 자동으로 오버 플로우를 버릴 수있을 것입니다,하지만 오히려 혼란 스러울 것 conventient보다.

그런 다음 우리는 할 것이다 :

byte b = 128; 
if (b < 0) { 
    // yes, the value magically changed from 128 to -128... 
} 

대부분의 상황에서이 컴파일러는 값이보다는 그것을 그런 식으로 "수정"의 범위 밖에 있음을 이야기해야하는 것이 좋습니다.

4

당신은

int i = 0xFFFFFFFF; 

쓸 수 있지만, 0xFF로 255에 byte 그래서 그것과 동일하지 않은 int 값이 정의 할 수있는 방법은 없습니다입니다 당신은

byte b = 0xFF; 

을 쓸 수 없습니다 바이트 또는 짧은 리터럴이므로 캐스팅해야합니다.당신은

byte b = 0; 
b += 0xFF; 
b ^= 0xFF; 

을 할 수있는 BTW

byte b = 30; 
b *= 1.75; // b = 52. 
+0

감사합니다. 최근에 + =의 암시 적 캐스트에 대해 알게되었습니다. Java에서 나는 0xff가 int임을 동의합니다. 그것이 바로 그 것이다. 하지만 일반적으로 0xff는 8 비트에 부호가 있으므로 바이트에 할당 할 수 있어야합니다. 어쨌든 나는 질문에 대한 대답이라고 생각한다. 바이트는 2의 보수로 구현된다. – Sridhar

+0

0xFF는 바이트 리터럴 형식이 없기 때문에 255로만 쓸 수 있습니다. 0xFF는 바이트없이 캐스팅하지 않고 쓸 수 없습니다. c.f. '0xFFL'은'long'입니다 –

+0

당신이 맞습니다. 그러나 당신은 그것을 쓸 수 있습니다. I.E. 바이트 b = (바이트) 0xFF; 물론 그것은 -1로 실패합니다 :-) –

1

당신은 문자 그대로 바이트를 설정할 수 있지만 놀랍게도, 당신이 더 많은 자리 사용해야합니다 :

byte bad = 0xff; // doesn't work 
byte b = 0xffffffff; // fine 

논리가입니다 0xff는 암시 적으로 0x000000ff이며 이는 바이트 범위를 초과합니다. (255)

처음 생각하는 것은 아니지만 약간의 논리가 있습니다. 숫자가 길수록 숫자가 작고 (절대 값이 작음)

byte b = 0xffffffff; // -1 
byte c = 0xffffff81; // -127 
byte c = 0xffffff80; // -128 
관련 문제