본문 바로가기
C언어

[C언어] 상수의 비트 형태

by 에파 2021. 5. 7.
728x90

C언어 상수의 비트 형태

 

상수가 컴파일된 후의 비트 형태

 

편집기에 코드를 입력하면 이 코드는 모두 컴퓨터가 이해하는 형태의 아스키 코드 값으로 저장됩니다. 예를 들어 10 + 20; 을 입력했다면 1, 0, +, 2, 0, ; 이 모두 하나의 문자로 저장됩니다. 컴파일 과정이 없으면 코드가 컴퓨터에서 실행되지 않는 이유가 바로 이 때문입니다. 컴퓨터에서 +는 '덧셈을 하라'는 명령이 아니라 그저 '+' 문자이고, 10과 20도 연산이 가능한 값이 아니라 문자입니다.

 

(아스키코드는 사람이 사용하는 기호를 컴퓨터 안에서 표현하는 방법에 대해 약속한 것입니다. 아스키 코드는 컴퓨터에서 필요한 128개의 문자를 코드화했으며 여기에는 영문 대문자, 소문자, 아라비아 숫자, 특수 문자, 제어 문자 등이 포함됩니다. 필요 시 아래 사이트를 참고하세요.)

 

http://www.ascii-codes.com/

 

Ascii table for IBM PC charset (CP437) - Ascii-Codes

Code page 437 (IBM PC) American Standard Code for Information Interchange (ASCII) is a widely used character encoding system introduced in 1963. The original character set, which is now referred as the standard character set was initially composed of 128 c

www.ascii-codes.com

 

컴퓨터는 모든 데이터를 비트로 변환합니다. 1비트는 0과 1, 이렇게 2개의 값을 갖습니다. 비트가 8개면 이를 1바이트라고 하고 2^8 = 256 으로 1바이트의 값은 256가지입니다. 데이터의 크기가 크면 프로그램에서 사용할 수 있는 값의 크기가 커지지만, 메모리나 연산에 부담을 주므로 무조건 크게 할 수는 없습니다.

 

 

정수 상수와 실수 상수의 컴파일

 

정수 상수를 컴파일하면 4바이트로 표현합니다. 반면 실수는 8바이트로 표현합니다.

 

 

10 (정수 상수) : 00000000 00000000 00000000 00001010

10.0 (실수 상수) : 01000000 00100100 00000000 00000000 00000000 00000000 00000000 00000000

 

 

우리는 10과 10.0 의 차이를 느끼지 못하지만 컴퓨터는 이 둘을 다르게 인식하고 처리합니다. 어떤 상수를 쓰느냐에 따라 실행 속도나 정확도에 차이가 날 수 있습니다. 정수는 가장 빠르고 정확하게 연산될 수 있는 형태이므로 프로그래밍할 때 가능하면 정수 상수를 사용하는 것이 좋습니다.

 

 

문자 상수의 컴파일

 

그러면 문자 상수는 어떻게 표현될까요? 문자 상수를 컴파일하면 2진수 형태의 아스키 코드 값으로 변역됩니다. 예를 들어 문자 'A'의 아스키 코드 값은 65 이므로 정수 상수 65와 같은 형태로 변역됩니다.

 

 

65 (아스키 코드 값) : 00000000 00000000 00000000 01000001

'A' (문자 상수) : 00000000 00000000 00000000 01000001

 

 

결국 문자 상수는 소스 코드에서 문자임을 표현하는 방법이며 컴퓨터 안에서는 정수와 같은 방식으로 처리됩니다.

 

 

정수 상수가 컴파일된 후의 비트 형태

 

정수는 0을 포함한 양수와 음수로 나뉩니다. 이 둘을 표현하는 방법을 살펴보겠습니다.

 

 

양수의 변환

 

정수를 컴파일하면 4바이트 크기의 2진수로 변환된다고 했습니다. 예를 들어 정수 13을 컴파일하면 2진수로 1101 이 되는데 4바이트 크기로 표현해야 하니 남은 빈 공간을 아래처럼 모두 0 으로 채워야합니다.

 

 

00000000 00000000 00000000 00001101

 

 

보면 알다시피 1을 갖는 비트가 왼쪽에 위치할수록 값의 크기가 커집니다. 그러면 1바이트 정수 표현 시 최솟값과 최댓값을 알아봅시다. 모든 비트가 0일 때 가장 작고 모든 비트가 1일 때 가장 큽니다. 다음 규칙에 따라 쉽게 계산할 수 있습니다.

 

 

1비트 : 0 ~ 2^1 -1

8비트 : 0 ~ 2^8 -1

32비트 : 0 ~ 2^32 -1

 

 

이 계산에 따르면 4바이트로 표현할 수 있는 정수의 최댓값은 2^32 -1 인데 이보다 큰 상수를 사용하면 컴파일러는 자동으로 데이터의 크기를 8바이트로 늘려 처리합니다. 만약 값의 크기와 상관없이 8바이트로 만들고 싶을때는 정수에 접미사 LL 또는 소문자 ll 을 붙여 사용합니다. (Long Long) ex) 32LL

 

 

음수의 변환

 

음수는 절댓값을 2의 보수로 바꾸어 처리합니다. 2의 보수란 2진수의 0과 1을 바꾼 상태에서 1을 더한 값을 말합니다. 예를 들어 -10은 그 절댓값인 10을 2진수로 바꾸고 1의 보수를 구한 후에 다시 1을 더하여 2의 보수로 만듭니다.

 

  1. -10 을 절댓값 변환을 하면 10 입니다.
  2. 10 을 2진수로 변환하면 00000000 00000000 00000000 00001010 입니다.
  3. 0과 1을 바꾸면(1의 보수) 11111111 11111111 11111111 11110101 입니다.
  4. 1을 더하면 11111111 11111111 11111111 11110110 이 되고 이것이 -10을 2진수로 바꾼 값입니다.

음수를 2의 보수로 처리하는 이유는 특별한 변환 과정 없이 바로 양수와 음수를 더할 수 있기 때문입니다.

 

 

실수 상수가 컴파일된 후의 비트 형태

 

2진수로 값을 표현하는 방식은 값의 크기에 비례하여 데이터의 크기도 커지므로 아주 큰 값이나 소수점 이하를 표현하는 데 한계가 있습니다. 따라서 실수는 데이터를 표현하는 효과적인 방법을 만들고 그 규칙에 따라 표현합니다.

 

실수는 제한된 데이터 크기에 수를 표현하기 위해 IEEE 754 표준을 따르는데 이 표준에는 single, double, quad 이 있습니다. 그 중 가장 많이 사용하는 double 형식에 대해서만 간단히 살펴보겠습니다. double 형식은 실수를 8바이트(64비트)로 표현하며 64비트는 1비트의 부호 비트, 11비트의 지수부, 52비트의 소수부로 나뉩니다.

 

 

ㅁ ㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁㅁ ㅁㅁㅁㅁㅁㅁㅁㅁㅁ~ㅁㅁㅁ

 

 

  • 부호 비트 : 가장 왼쪽 비트는 부호 비트이며 양수는 0, 음수는 1로 표시합니다.
  • 지수부 : 부호 비트 다음부터 11비트는 지수값을 의미합니다.
  • 소수부 : 나머지 52비트는 소수값을 의미합니다.

 

예를 들어 실수 -6.5는 컴파일 후 다음과 같은 비트열이 됩니다.

 

 

1 10000000001 101000000000000000000000000000000000000000000000000

 

 

최댓값과 최솟값을 생각해보면, 최댓값은 지수부분과 소수부분이 가장 큰 값을 가질때이며, 최솟값은 최댓값에 부호만 바꾸면 됩니다. 대략 -1.79 x 10^308 ~ 1.79 x 10^308 정도의 범위의 실수를 표현할 수 있습니다.

댓글