반응형

언어 자료구조 알고리즘/디딤돌 C언어 150

[디딤돌 C언어] 20. 실수 형식의 메모리 구조

20. 실수 형식의 메모리 구조 어려울 수 있는 내용이지만 프로그래밍할 때 크게 중요한 내용은 아니예요. 실수 형식은 근사치라는 정도로 이해해도 큰 문제는 없어요. 그래도 한 번 살펴보세요. 컴퓨터에서 실수는 어떻게 표현하고 어떻게 메모리에 저장될까요? C언어에서 실수는 부호 비트와 지수부와 실수부로 나누어 메모리에 저장하고 있어요. float은 상위 1비트가 부호 비트이고 이어지는 8개의 비트에 지수부를 표현하고 나머지 23개의 비트에 가수부를 표현한답니다. 그리고 지수부는 밑수를 2로 할 때의 지수를 나타내는데 0승일 때가 0111 1111으로 표현하고 있어요. 1승일 때 1000 0000, 2승일 때는 1000 0001 이죠. 물론 -1승일 때는 0111 1110 입니다. -13.625를 float..

[디딤돌 C언어] 19. 실수는 근사치

19. 실수는 근사치 0.1에서 0.5사이에 몇 개의 실수가 있을까요? 여러분이 아는 것처럼 무한 개의 실수가 존재하죠. 따라서 0.1과 0.5 사이의 모든 실수를 유한한 메모리에 표현할 수 없어요. 실제로 컴퓨터에서 실수 표현은 오차 범위 내에서 값을 표현하는 근사치예요. C언어에서는 실수 형식으로 float 형식과 double 형식을 제공해요. float 형식은 4바이트이며 double 형식은 8바이트예요. 그리고 C언어에서 실수 표현은 기본적으로 double 형식으로 취급하며 float 형식을 표현할 때는 뒤에 f를 붙여요. 그렇지만 C언어에서 실수 형식 사이에는 서로 묵시적 형변환을 제공해서 실수 뒤에 f를 붙이지 않아도 가능하답니다. 물론 값 잘림 현상이 발생할 수 있으니 주의하세요. ◈ 실수 ..

18. Overflow와 값 잘림 현상

18. Overflow와 값 잘림 현상 만약 정수 형식에서 표현할 수 있는 범위를 벗어나는 연산을 수행하면 어떻게 될까요? 표현 범위를 벗어날 때 처리하는 방식은 프로그래밍 언어마다 달라요. C언어에서는 표현 범위를 벗어나도 프로그램은 예외를 발생하지 않고 동작해요. 물론 연산 결과는 개발자가 원하는 결과가 아닌 엉뚱한 값이 되겠죠. 이처럼 연산 결과가 표현 범위의 벗어나는 것을 오버플로우(overflow)라고 불러요. 좀 더 세분화하면 최대값을 넘어서는 것을 오버플로우, 최소값보다 작아지는 것을 언더플로우(underflow)라고 부르죠. 예를 들어 char 형식 변수 c1에 127(16진수 0x7F)로 설정한 후에 1을 더하면 오버플로우가 발생해요. 이 때 연산 결과는 -128(16진수 0x80)이예요..

17. 정수 형식의 표현 범위

17. 정수 형식의 표현 범위 char 형식과 unsigned char 형식은 정수를 표현할 때도 사용할 수 있다고 했어요. 두 가지 형식 모두 1바이트를 할당하여 256가지의 정수를 표현할 수 있답니다. unsigned char 형식은 부호없는 정수만 표현하므로 0~0xFF(0~255)까지 표현 가능해요. char 형식은 최상위 비트가 0인 0x00~0x7F(0~127)까지는 부호없는 정수예요. 그리고 최상위 비트가 1인 0x80~0xFF(-128~-1)까지는 부호있는 정수죠. ◈ char 형식과 unsigned char 형식의 표현 범위 확인 #include int main() { char c = 0; unsigned char uc = 0; c = 0x7F; //최상위 비트가 0 uc = 0x7F; ..

16. char 형식으로 정수 표현, 형변환

16. char 형식으로 정수 표현, 형변환 C언어에서는 char 형식도 정수 형식으로 취급한답니다. 문자를 표현할 때도 사용하지만 표현 범위가 -128~127 사이의 정수를 나타낼 때도 사용할 수 있어요. 특히 C언어에서 제공하는 정수 형식 사이에서는 서로 대입하거나 비교를 할 수 있어요. 프로그래밍에서 서로 다른 형식 사이에 대입하거나 비교하기 위해 형식을 변환하는 것을 형변환이라 불러요. 특정 형식 사이에서는 별다른 표현을 하지 않아도 내부적으로 형변환을 해 주기도 하는데 이를 묵시적 형변환이라고 말하죠. 만약 서로 다른 형식 사이에 대입하거나 비교하는 구문이 있어도 컴파일에 문제가 없다면 묵시적 형변환을 제공하는 거예요. 그리고 개발자가 명확하게 형식 변환을 표현하는 것을 명시적 형변환이라고 말해..

15. ASCII 코드

15. ASCII 코드 C언어에서 char 형식은 -128~127까지의 정수를 표현할 수 있는 정수 형식이예요. 형식 이름을 보면 알 수 있듯이 char 형식은 문자를 표현할 때 많이 사용하죠. 미국 표준 기구(ANSI, American National Standards Instutitute)에서는 영문 알파벳과 숫자 문자와 여러 기호를 아스키 코드로 정의했어요. 아스키 코드에는 128개의 문자를 약속하고 있답니다. 최초의 아스키 코드는 하드웨어 사이에서 주고 받는 신호를 약속한 것으로 제어 신호도 포함하고 있어요. char 형식이 8비트(1바이트)죠. 첫번째 비트는 0이고 나머지 비트를 아스키 코드를 이용하여 표현해요. 예를 들어 8비트의 메모리에 01100001 값이 있으면 문자 a를 의미하고 011..

14. 부호있는 정수 표현 - 2진 보수 방식

14. 부호있는 정수 표현 - 2진 보수 방식 마지막으로 C언어에서 사용하는 2진 보수 방식을 알아봅시다. 2진 보수를 이용할 때도 첫번째 비트가 0일 때는 다른 방법과 같아요. 다른 부분은 첫번째 비트가 1일 때 부호있는 정수를 나타내고 나머지 비트를 2진 보수를 취한 값이 크기로 판단한다는 것이죠. 2진수를 2진 보수를 취할 때는 1진 보수를 계산한 후에 1을 더합니다. 예를 들어 8비트의 메모리에 10010001 값이 들어있다면 첫 번째 비트가 1이므로 부호있는 정수죠. 그리고 나머지 비트인 0010001를 1진 보수를 취하면 1101110이예요. 2진 보수는 1진 보수를 계산한 값에 1을 더하므로 11011111이죠. 따라서 크기가 64+32+8+4+2+1 이므로 111이며 부호가 있어서 -110..

13. 부호있는 정수 표현 - 1진 보수 방식

13. 부호있는 정수 표현 - 1진 보수 방식 이번에는 1진 보수를 이용하여 부호있는 정수를 표현하는 방법을 알아볼게요. 1진 보수를 이용할 때도 첫번째 비트가 0일 때는 부호없는 정수이며 나머지 비트는 크기예요. 하지만 첫번째 비트가 1일 때는 음의 정수를 나타내며 나머지 비트를 1진 보수를 취한 값이 크기를 나타내죠. 먼저 2진수를 1진 보수를 취하는 예를 들어볼게요. 2진수를 1진 보수로 바꿀 때는 각 비트를 0은 1로 바꾸고 1은 0으로 바꾸세요. 예를 들어 2진수 01011010을 1진 보수를 취하면 10100101이예요. 8비트의 메모리에 10010001 값이 들어있다면 첫번째 비트가 1이므로 부호있는 정수예요. 그리고 나머지 비트인 0010001를 1진 보수를 취하면 1101110이죠. 따라..

12. 부호있는 정수 표현 - 부호비트 필드

12. 부호있는 정수 표현 - 부호비트 필드 메모리에 부호있는 정수를 표현하는 방법은 여러가지 방법이 있어요. 그 중에 대표적인 방법이 부호비트 필드 방식, 1진 보수 방식, 2진 보수 방식이 있죠. C언어의 정수 형식은 2진 보수 방식을 사용하고 있어요. 이제 이 세가지 방법을 알아봅시다. 먼저 부호 비트를 이용하는 방법을 알아볼게요. 부호비트 필드 방식에서는 첫 번째 비트를 부호비트로 사용하는 방식이예요. 첫 번째 비트가 1이면 부호있는 정수이고 0이면 부호없는 정수인 것이죠. 그리고 나머지 비트는 크기를 나타내요. 예를 들어 8비트의 메모리에 10010001 값이 들어있다면 첫번째 비트가 1이므로 부호있는 정수예요. 그리고 나머지 비트인 0010001이 크기를 나타내죠. 이진수 0010001은 16..

11. 메모리, 10진수, 2진수, 16진수

11. 메모리, 10진수, 2진수, 16진수 프로그램의 메모리의 최소 단위는 비트죠. 그리고 하나의 비트에는 0과 1을 표현할 수 있구요. 이러한 특징때문에 메모리에 있는 데이터를 표현할 때 2진수로 나타내는 것이 편리해요. 예를 들어 8비트의 메모리에 10110111 값이 있을 때 이진수로 생각해 보세요. 이를 10진수로 나타내면 128X1+64X0+32X1+16X1+8X0+4X1+2X1+1X1 = 183 입니다. 큰 정수를 이진수로 나타내는 것은 계산하는 시간이 많이 들겠죠. 그리고 효과적으로 계산하기 위해 4비트를 하나의 16진수로 나타내는 방법도 자주 사용해요. 예를 들어 8비트의 메모리에 10110111 값이 있다면 1011 과 0111로 구분하세요. 그리고 1011은 16진수 B로 0111은 ..

반응형