• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

signed integer의 최댓값을 2진수로 출력할 때, 31bit만큼만 출력되는 것에 대한 질문

21.06.20 14:03 작성 조회수 342

0

signed int 타입 변수의 최댓값을 2진수로 출력해보면 31bit만큼만 출력됩니다.

최솟값을 출력했을 때는 32bit 만큼 출력되는데 어째서 최댓값 출력할 때는 31bit만큼만 나오는 것일까요?

32bit만큼 출력해서 0111 ... 1111 이렇게 나오게 하려면 어떤 라인에서 수정해야할까요?

답변 1

답변을 작성해보세요.

1

안소님의 프로필

안소

2021.06.20

signed 정수들은 최상위(가장 왼쪽) 비트를 부호를 나타내는 비트로 씁니다. 즉, signed int 라면 1 비트는 부호 나타내는데 쓰고 나머지 31비트를 값을 나타내는데 쓰는거에요! 양수는 이 비트가 0 이고, 음수는 이 비트가 1 입니다. 그래서 sigend int 의 최대값이 2^32 가 아닌 2^31 인 이유입니다.(0 이 포함되니 정확히는 2^31 -1이 최대값) 31 비트로 값을 표현하기 때문이죠! INT_MAX 는 양수이기 때문에 최상위 비트는 0 입니다. 그래서 31비트만 출력된 것입니다. 앞의 0 이 생략되어서요! 예를 들어 111 이라는 비트가 있다면 이건 00000111 이라고 볼 수도 있지만 그냥 앞의 0 은 생략하고 111 이라고만 하잖아요! 6월도 06월 이렇게 말할 수도 있지만 0 빼고 6월이라고 하기도 하죠. 0 이 생략된건 그냥 이런 이유라고 생각해주시면 될 것 같아요!

이와 반대로 음수는 최상위 비트가 1입니다. 그래서 INT_MIN 이 1111 1111 1111 1111 이지만 사실상 가장 왼쪽 1 은 음수임을 나타낼 때 쓰는 비트구요, 실제 값을 표현하는건 나머지 31비트입니다. 얘는 맨 앞도 1이니까 생략되지 않고 32비트가 다 출력이 됐던겁니다.

printf("%032s\n", max_bi_buffer);

그래도 출력을 꼭 32자리로 맞추고 싶다면, 이렇게 출력 지정자를 %032s 라고 설정해주시면 돼요! 

32 자리로 꼭 맞춰 출력하되 빈자리는 0 으로 채워 출력 하겠다는 의미입니다.

swing-by님의 프로필

swing-by

질문자

2021.06.21

상세한 답변 감사합니다!! 100% 이해했습니다. 출력 지정자 첨언도 정말 감사드려요 !!