• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

이렇게 이해한 것이 바르게 이해한 것 인가요?

24.01.02 03:41 작성 조회수 134

1

안녕하세요 반갑습니다.

 

강의 22분 09초 경의 설명을 보고

 

부호 없는 정수의 언더 플로우가 헷갈려서 좀 생각을 해봤습니다.

 

unsigned int k = 0;

 

k = k-1;

 

printf("k = %u\n", k);

을 하면

 

k의 비트가 00000000000000000000000000000000였는데

 

리터럴 1을 빼면

 

ALU내부에선 -1을 더하게 되는 것과 같고

 

-1은 11111111111111111111111111111111비트여서

 

둘의 합연산 결과가 11111111111111111111111111111111이 되고 이걸 %u로 출력해주면 unsigned int의 최대값인 4294967295가 나오는 건가요? 질문 1)

 

10000비트에서 1을 뺀다는 설명 때문에 약간 헷갈리긴 하는데 직관적으로 이해를 돕기 위해 그렇게 설명해주신 거라고 보면 될까요? 질문 2)

 

그리고 추가적으로 C언어가 리터럴 상수를 해석하는 과정이 참 흥미로운데 이건 강의 후반부에 다뤄주시나요? 꽤나 궁금하네요. 질문 3)

 

 

질문 1) 2) 3)에 각각 대답해주시면 감사 하겠습니다.

답변 1

답변을 작성해보세요.

2

Soobak님의 프로필

Soobak

2024.01.02

안녕하세요, 답변 도우미 Soobak 입니다.

 

질문 1) 부호 없는 정수의 언더플로우 관련 질문
: 네, 맞습니다.
unsigned int 자료형은 부호가 없는 정수형이므로, 이 경우 0 에서 1 을 빼면 언더플로우가 발생합니다.
컴퓨터가 2의 보수 방식으로 계산하는 과정을 거치면, uinsinged int 자료형의 최대값 4294967295(32비트 환경에서)이 됩니다.
따라서, 0 - 11111...1111 과 같은 비트 표현을 가지며, 이는 4294967295 가 됩니다.

 

질문 2) 10000 비트에서 1 을 빼는 것과 같다는 내용의 설명
: 강의에서 0000 에서 1 을 빼면 1111 이 되는 과정에 대해서, "실제 비트에서 맨 앞자리의 1 은 없지만, 마치 10000 에서 1 을 빼는 것처럼 작동한다" 는 맥락으로 이해하시면 좋을 것 같습니다. 실제로, 이진수 10000 에서 1 을 빼면 01111 , 즉, 1111 이 되기 때문입니다.

 

질문 3) 강의 커리큘럼 질문
: 만약, 말씀하신 내용이 컴퓨터가 숫자를 표현하는 원리에 대해서 비트 단위로 확인하는 것이라면, 현재 수강하시고 계시는 섹션에서 학습하시게 됩니다.

3.11 부동소수점형 강의에서는 부동소수점형이 숫자를 표현하는 원리에 대해서 비트 단위의 관점에서 학습하시게 됩니다.
또한, 추후 섹션 15 비트 다루기 에서 비트를 제어하고 조작하는 다양한 방법과 원리들에 대해서 추가적으로 학습하시게 됩니다.
하지만, 기본적인 숫자 해석과 자료형에 대해서는 현재 수강하고 계시는 섹션에서 대부분 학습하십니다.

또한, 이러한 처리 과정은 기본적으로 C언어 뿐만 아니라, 보통 대부분의 프로그래밍 언어에서 유사합니다. 보다 높은 수준의 언어에서는 해당 처리가 더 추상화되어있고, 내부적인 세부 사항이 사용자로부터 숨겨져 있는 것으로 이해하시는 것이 적절한 것 같습니다.

다만, C언어에서는 상대적으로 낮은 수준의 메모리 관리와 자료형 시스템을 가지고 있기 때문에, 다른 언어보다 더 명시적이고 세밀한 제어를 가능하게 합니다.