진법 변환과 2의 보수

귀하의 데이터

앞에 붙은 0b, 0o, 0x는 받아들인 뒤 무시합니다. 숫자 사이의 공백과 밑줄도 마찬가지입니다.

결과

선택한 방식으로 읽은 그 비트의 값

똑같은 그 비트를, 다른 방식으로 읽으면
2진법으로
16진법으로
8진법으로
이 폭이 담을 수 있는 전부

부호를 바꾸는 과정

비트에서 시작
전부 뒤집기
1을 더하면 그것이 음수

비트를 뒤집고 1을 더하는 것은 2의 폭 제곱에서 빼는 것과 같으며, 8비트의 256가지 패턴 전부에서 확인했습니다. 두 번 하면 언제나 처음으로 돌아오고, 바로 그 성질이 이 방식 전체를 지탱합니다.

이 페이지는 흔한 부동소수점 대신 크기에 제한이 없는 정수로 계산합니다. 대략 구천조를 넘어가면 보통의 자료형이 값을 건너뛰기 시작하기 때문입니다. 2의 53제곱에 1을 더해도 2의 53제곱이 나옵니다. 64비트에서는 그것이 조용히 틀린 답을 내놓게 됩니다.

반응

0

0 코멘트

User profile image

첫 댓글을 남겨보세요

왜 200이 마이너스 56으로 나오나요?

200과 마이너스 56은 같은 여덟 비트, 11001000이기 때문입니다. 그 비트 어디에도 둘 중 무엇을 뜻했는지는 적혀 있지 않습니다. 폭과 읽는 방식은 다른 곳에서, 프로그램을 쓴 사람이 정하며, 비트는 두 답 모두에 어울립니다.

차이의 전부는 맨 왼쪽 비트입니다. 그것이 꺼져 있는 동안에는 두 읽기가 정확히 일치하며, 그래서 값이 절반을 넘기 전까지 불일치가 보이지 않습니다.

왜 범위가 마이너스 128부터 127까지이고, 마이너스 127부터 127까지가 아닌가요?

0도 어딘가에는 있어야 하고, 그 자리는 양수 쪽입니다. 여덟 비트는 256가지 서로 다른 패턴을 주는데, 그중 하나를 0이 쓰므로 255개를 나눠 갖습니다. 나눠 보면 양수 127개, 음수 128개라서 음수 쪽이 하나 더 많습니다.

어떤 폭에서도 같습니다. 16비트는 마이너스 32768부터 32767까지, 64비트는 마이너스 9223372036854775808부터 9223372036854775807까지입니다.

반대 부호가 없는 수가 있나요?

있습니다. 폭마다 정확히 하나, 가장 작은 음수입니다. 8비트의 마이너스 128에는 양수 쌍이 없습니다. 128은 양수 쪽에 없는 자리를 필요로 하기 때문입니다.

10000000의 비트를 뒤집으면 01111111이 되고, 1을 더하면 다시 10000000으로 돌아옵니다. 부호를 바꿔도 같은 수가 돌아오는 것입니다. 이 페이지는 그것을 숨기지 않고 보여 주며, 이 성질은 8, 16, 32, 64비트에서 확인했습니다.

수가 들어가지 않으면 어떻게 되나요?

값이 한 바퀴 돌아갑니다. 이 페이지는 거부하는 대신 그 결과를 보여 줍니다. 8비트에 300을 쓰면 44가 저장되고, 마이너스 129를 쓰면 127이 저장됩니다.

페이지가 너그러운 것이 아니라, 하드웨어가 그렇게 동작합니다. 오류를 띄우면 당신이 아마도 이해하러 온 그 버그의 원인 자체를 가리게 됩니다.