300을 byte로 강제변환 할 경우엔 byte 범위를 초과한 나머지값...44를 출력한다는건 알겠는데 왜 그 256 이하인 값도 그대로 출력 못하는건가요?
예를 들면
System.out.print((byte)256); 하면
0이 출력됩니다.
또 -128~127까진 그대로 출력하는데 왜 이렇게 일관성이 없게 출력하는지 이유좀 간단히 알 수 있을까요? 이게 16진수랑 관련 있는건지..
답변 해주신 분께 미리 감사드립니다.
5개의 댓글
무분별한 사용은 차단될 수 있습니다.
숨은음은
일관성이 없는게 아니라 일관성이 있는 것임
우선 java의 byte 자료형은 2^8개의 정수를 표현할 수 있는데, 이 때 표현하는 범위는 음수, 양수 포함.
그러므로 256개중 절반은 양수, 절반은 음수를 표현할 수 있음.
그러므로 -128~-1 음수, 0, 1~128 양수까지만 저장할 수 있음 그 이상은 자료형에 저장할 수 있는 범위 초과이므로 출력을 못함.
256을 byte타입으로 형변환하면 127까지는 127이지만 그 초과분은 다시 거꾸로 -128부터 시작함. 그래서 256-127 = 129이므로
-128부터 세어나가다보면 -128로부터 129번째가 0이 되는 걸 알 수 있을 거임
그래서 0이 출력된거야.
257이라고 하면 1이 출력될거임.
찰나생멸
답변 감사합니다. 수긍할 수 있을 정도로 이해했습니다.
숨은음은
앗 미안.. -128~127까지 표현가능임 위에 실수로 1~128이라고 썻넹
고것만 수정하고 싶은데 답글달려서 수정이 안됨 ㅠ
돌입
각 타입별로 표현할 수 있는 범위의 한계가 있음
컴퓨터는 이진수만 이해할 수 있고 byte는 8bit라는건까진 알고있지?
일반적으로 컴퓨터에서는 최상위비트(MSB)를 부호비트로 사용하고 해당 비트가 0일때 양수 1일때 음수로 표현함
정수형은 총 2^n개로 표현가능한데 byte는 8bit이고 숫자 0과 음수, 양수를 포함해서 -2n^(n-1) ~ 2^(n-1) - 1까지 표현이 가능해짐
진법변환과 보수법칙을 찾아서 공부하면 이해가 쉬울거야
본론으로 돌아가서 정수 300은 이진법으로 표현하면 32bit로 된 값일꺼야 앞에 빈자리들은 0으로 채워질꺼고 4자리씩 자른다 생각하고 의미있는 값들만 보면 0001/0010/1100 이고 이를 byte로 형변환하게되면 앞의 bit들이 다 떨어져나가고 제일 오른쪽 8bit만 남게되어 0010/1100만 남을거임
해당 bit를 10진수로 계산해보면 부호비트가 0이므로 양수로 표현되고 값은 32 + 8 + 4가 되므로 결과값인 44가 나오게되는거여
찰나생멸
아 이렇게 생각할 수 있군요. 알려줘서 고마워요!