byte, short 및 int가 서명 된 경우 Java에서 byte와 short가 보통 signed two's complement으로 처리되지 않는 이유는 무엇입니까? 예를 들어 0xff는 바이트에 대해 올바르지 않습니다.바이트가 2의 보수로 서명되지 않았습니까?
이 내용은 here 전에 논의되었지만 이것이 왜 그런지 이유를 찾을 수 없었습니다.
byte, short 및 int가 서명 된 경우 Java에서 byte와 short가 보통 signed two's complement으로 처리되지 않는 이유는 무엇입니까? 예를 들어 0xff는 바이트에 대해 올바르지 않습니다.바이트가 2의 보수로 서명되지 않았습니까?
이 내용은 here 전에 논의되었지만 이것이 왜 그런지 이유를 찾을 수 없었습니다.
-1
을 부호있는 바이트로 저장하는 데 사용 된 실제 메모리를 보면 0xff
이라는 것을 알 수 있습니다. 그러나 이진 표현보다는 언어 자체에서 0xff
이 단순히 한 바이트의 범위를 벗어납니다. -1
의 2 진 표현은 실제로 2의 보수를 사용하지만 구현 세부 사항으로부터 보호됩니다.
언어 디자이너는 -128에서 127까지만 유지할 수있는 데이터 형식에 255를 저장하려고하면 오류로 간주해야한다는 입장을 간단하게 나타냅니다. 자바가 있습니다 이유
당신은 코멘트 요청 :
int i = 0xffffffff;
문자 적 0xffffffff
는 int
문자이며 2의 보수를 사용하여 해석됩니다. 바이트에 대해 비슷한 작업을 수행 할 수없는 이유는 리터럴 형식이 byte
이거나 실제로 short
이라는 구문을 제공하지 않기 때문입니다.
더 많은 리터럴 유형을 제공하지 않기로 한 결정이 만들어진 이유를 모르겠습니다. 나는 그것이 단순성의 이유로 만들어진 것이라고 기대한다. 언어의 목표 중 하나는 불필요한 복잡성을 피하는 것이 었습니다.
유효하지만 범위를 벗어 났으므로 명시 적으로 바이트 (byte) 0xff로 캐스팅해야합니다.
-128에서 127
에 byte
범위에 사용할 수있는 값이이 범위를 벗어나는 값을 변수에 할당 할 수 있도록하고, 자동으로 오버 플로우를 버릴 수있을 것입니다,하지만 오히려 혼란 스러울 것 conventient보다.
byte b = 128;
if (b < 0) {
// yes, the value magically changed from 128 to -128...
}
대부분의 상황에서이 컴파일러는 값이보다는 그것을 그런 식으로 "수정"의 범위 밖에 있음을 이야기해야하는 것이 좋습니다.
당신은
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.
감사합니다. 최근에 + =의 암시 적 캐스트에 대해 알게되었습니다. Java에서 나는 0xff가 int임을 동의합니다. 그것이 바로 그 것이다. 하지만 일반적으로 0xff는 8 비트에 부호가 있으므로 바이트에 할당 할 수 있어야합니다. 어쨌든 나는 질문에 대한 대답이라고 생각한다. 바이트는 2의 보수로 구현된다. – Sridhar
0xFF는 바이트 리터럴 형식이 없기 때문에 255로만 쓸 수 있습니다. 0xFF는 바이트없이 캐스팅하지 않고 쓸 수 없습니다. c.f. '0xFFL'은'long'입니다 –
당신이 맞습니다. 그러나 당신은 그것을 쓸 수 있습니다. I.E. 바이트 b = (바이트) 0xFF; 물론 그것은 -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
구현이 2를 보완 해 주셔서 감사합니다. 그런데 왜 언어가 int에 0xffff_ffff를 허용합니까? – Sridhar