인프런 커뮤니티 질문&답변

당황한 청어님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C언어

4.10 scanf() 함수의 사용법

변수에 값을 할당하기 전에 컴퓨터는 어떻게 계산을 하나요?

작성

·

175

2

    char ch;
    scanf("%hhd", &ch);
    printf("%i"ch);
Overflow에 관한 질문이 있습니다.
char 데이터는 -128 ~ 127까지 값을 사용할 수 있습니다. 이때
128 값을 할당하면 -128로 overflow
129 값을 할당하면 -127로 overflow
130 값을 할당하면 -126로 overflow가 됨이 신기했습니다.
 
왜냐하면 overflow된 값을 보간법으로 처리하는 방법을 모르기 때문에 출력값을 기준으로 컴퓨터가 어떻게 동작하고 있는지 추측해봐야 했습니다.
 
binary 계산으로 보면 컴퓨터는 단순히 1을 계속하여 더하고 있을 뿐입니다.
 
부호| 값
0 | 111 1111 = 127 <= 127
1 | 000 0000 = -128 <= 128
1 | 000 0001 = -127 <= 129
1 | 000 0010 = -126 <= 130
 
질문입니다.
1) 그렇다면 컴퓨터가 int 타입의 16이란 숫자를 저장할 때도
0부터 계속해서 1을 더하여 16을 구하는 건가요? 컴퓨터가 데이터를 저장하기 전 계산하는 과정이 궁금해졌습니다!
 
2) int 타입은 그렇다고하면 float나 double같은 경우는 exponent와 fraction이 각각 나누어져 있기 때문에 실제 값을 계산하고 할당할 때 상당히 복잡한 과정이 있을 것 같습니다. 교수님이 알려주셔서 각 파트를 어떻게 계산하는지는 알고 있으나 컴퓨터가 이 과정을 어떻게 계산하고 처리하는지는 막상 상상이 되지 않습니다.
 
c 언어가 상당히 저수준의 언어라고 생각해서 배우면 컴퓨터를 잘 이해할 수 있을 거 같았는데 뭔가 더 깊은게 많을 거 같네요 ㅠㅠ 도와주세여

답변 1

1

홍정모님의 프로필 이미지
홍정모
지식공유자

안녕하세요? 좋은 질문입니다. 사람이 나열한 기호들(1과 6이라는 기호 2개)이 데이터(정수 연산이 가능한 16이라는 데이터가 2진수의 형태로 메모리에 저장)로 어떻게 변환이 되는지 궁금하신 것 같네요. 컴파일러가 해주는 일인데 1씩 세는 것 보다는 더 효율적인 방법으로 처리합니다. 더 정확히는 C언어 '컴파일러'의 코드를 봐야할 것 같은데 제가 컴파일러 전공은 아니라서 볼 생각을 안해봤네요.

다르지만 비슷한 사례로는 C언어에서 사람이 입력한 16을 숫자 16으로 변환하는 코드는 제가 찾아봤는데 아래에서 참고하실 수 있습니다. 

https://code.woboq.org/userspace/glibc/stdlib/strtol_l.c.html

문자열을 숫자로 변환하기, 비트연산자 등은 뒤에 나오니 그때 공부하시면 됩니다.