상수와 데이터 출력

AleXtep·2023년 3월 10일

C 언어

목록 보기
2/3

Notion link : https://melon-taker-d3e.notion.site/2-f04a9eaa69fe4e64b4ae6436992e6607

  • printf: 형식화된 출력
  • stdio.h: 표준 입력 출력
  • 제어 문자: 문자는 아니지만 출력 방법에 영향을 미침
    • \n: 새 줄
    • \t: 탭 (8 공백)
    • \b: 백스페이스
    • \r: 캐리지 리턴 (처음으로 이동)
    • \a: 경고음
  • 정수와 부동 소수점 출력
    • 정수: %d (10진수)
    • 부동 소수점: %lf (긴 실수)
      • .1lf는 소수점 첫 자리까지 출력

상수와 데이터 출력

  • 부동 소수점 상수는 정규화된 표기법으로 표현됨
    (부동 소수점 상수의 정규화된 표기법 예: 3.14e-2)
    %le 변환 문자 사용

문자와 문자열 상수의 표기

  • 작은 따옴표와 큰 따옴표 사용

상수 컴파일 후 비트 표현

  • 10+20;을 입력하면 한 문자로 저장됩니다. 1,0,+,2,0,; 즉, 모든 문자는 문자열로 처리됩니다. 연산자는 컴파일 후에만 명령으로 처리됩니다.
  • 문자 상수를 컴파일하면 이진 ASCII 코드로 변환됩니다.

컴파일된 정수 상수의 비트 표현

  • 양수의 변환
    • 숫자의 이진 표현을 그대로 사용합니다.
  • 음수의 변환
    • 2의 보수 방법을 사용합니다.
    • 먼저 절대 값의 이진 표현을 나타냅니다.
    • 각 비트를 반전한 다음 1을 더합니다.
    • 주어진 숫자에 대해 결과 값을 이진으로 변환하고 첫 번째 비트를 부호 비트로 사용합니다.
    • 예를 들어, -6.5는 6.5를 이진으로 나타내고 각 비트를 반전하고 1을 더하면 1101.1이 됩니다. 이를 다시 이진으로 변환하면 -6.5의 결과 값은 1010.1이 됩니다.

💡 뺄셈에 2의 보수를 사용하는 이유
음수를 나타내기 위해 2의 보수를 사용하는 이유는 뺄셈 연산을 덧셈 연산으로 변환하기 위해서입니다. 예를 들어, 5-3은 5+(-3)으로 나타낼 수 있습니다. 이 경우, 2의 보수로 나타낸 -3은 11111101입니다. 이를 5에 더하면 1010이 되어 10진수로는 2와 같습니다. 이는 뺄셈을 수행하지 않고 덧셈 연산만으로 양수와 음수 간의 연산을 처리할 수 있다는 것을 의미합니다.

컴파일된 부동 소수점 상수의 비트 표현

  • IEEE 754 표준 (단정밀도, 배정밀도, 쿼드 포맷)을 따릅니다.

💡 부동 소수점 구조
9.6875는 이제 -1001.1011(2)입니다. 그러나 아직 끝나지 않았습니다. -1001.1011(2)를 그대로 저장하면 고정 소수점이 됩니다. 이는 부호 비트를 음수로, 정수 부분을 1001로, 소수 부분을 1011로 저장해야 합니다. 따라서 실수를 나타내는 지수를 사용하여 정규화 프로세스를 거칩니다.
정규화하면 1001.1011(2)는 -1.0011011×2³이 됩니다. 정규화는 정수 부분을 1로 맞추고 소수점을 적절하게 조정하는 것을 의미합니다. 여기서 지수는 2³이며 일반적으로 3의 지수를 나타냅니다. 이제 실수를 부동 소수점 수로 간단히 표현할 수 있습니다. 정규화 후 소수 부분의 유효 숫자는 "유효숫자"라고 합니다.
9.6875 → -1001.1011(2) → -1.0011011×2³ → [부호 비트 음수, 지수 3, 유효숫자 0011011]
부동 소수점 형식은 미리 결정된 비트 수 (32Bit 또는 64Bit)를 적절하게 분배하여 부호 비트, 지수, 유효숫자를 할당하기 위한 규칙과 약속입니다. 가장 일반적으로 사용되는 표준은 보통 IEEE754이며, 이 글도 IEEE754를 기반으로 설명합니다. 이 글의 목적은 IEEE754를 설명하는 것이 아닙니다. 주요 목적은 부동 소수점의 표현 방법과 그 문제점을 검토하는 것입니다. 대표적인 IEEE754 표준을 기반으로 설명할 것입니다. 일반적으로 C/C++와 Java는 부동 소수점 유형으로 float (32Bit)와 double (64Bit)을 제공합니다. 물론 double은 더 크기 때문에 더 나은 정밀도와 더 넓은 범위의 표현을 제공하므로 가능하다면 double을 사용해야 합니다. 그러나 이 글의 목적은 구조와 원리를 설명하는 것이므로 편의상 float을 기준으로 설명할 것입니다.
float: [ 부호 비트 1Bit | 지수 8Bit | 유효숫자 23Bit ] = 총 32Bit
double: [ 부호 비트 1Bit | 지수 11Bit | 유효숫자 52Bit ] = 총 64Bit
이제 유효숫자를 설명하고, 그 다음에 부호 비트를 설명하고, 가장 어려운 부분인 지수를 설명해 보겠습니다! 부호 비트는 매우 간단합니다. 양수이면 0이고 음수이면 1입니다. 지수를 설명하기 전에 유효숫자를 설명해 보겠습니다! 이미 변환된 유효숫자를 왼쪽에서부터 채우기만 하면 됩니다. 물론 나머지 부분은 모두 0입니다. 이해하기 가장 어려운 부분은 지수입니다. 일반적으로 부동 소수점에서 사용되는 지수는 2-127~2-128입니다. 지수는 8비트로 127부터 128까지 256단계를 나타내야 합니다. 정수를 나타낼 때와 마찬가지로 2의 보수 방법을 사용하여 표현할 수 있을 것 같지만 그렇지 않습니다. 모든 0으로 채워진 [0000,0000]는 -127을 나타내고, 1이 증가하는 [0000,0001]은 -126을 나타내고, 이와 같이 반복하면 모든 1로 채워진 [1111,1111]은 128을 나타냅니다. 이 방법을 바이어스 표현이라고 하며, 이 구조가 선택된 이유에 대해 궁금할 수 있습니다. 순수한 0을 나타내기 위해서입니다. 일반적으로 모든 변수를 기본 값으로 설정하는 방법은 변수가 차지하는 모든 메모리 비트를 0으로 설정하는 것입니다. float의 모든 비트를 0으로 채우는 것으로 생각해 보십시오. 2의 보수 방법을 사용하여 지수를 표현하면 1.00000...00000×20=1이 됩니다. 즉, 부동 소수점에서 모든 비트를 0으로 채우면 기본 값이 1이 되어 문제가 됩니다. 이를 나타내기 위해 바이어스 표현이 사용됩니다. 이에 대한 의문이 생길 수 있지만 나중에 자세히 설명될 것입니다.
이제 실제로 -9.6875를 float으로 표현해 보겠습니다! [부호 비트 음수, 지수 3, 유효숫자 0011011]으로 정규화하고 1차 기준으로 -127을 취하면 130차 기준이 됩니다. 즉, 이진으로 130을 표현하면 [1000,0010]이 됩니다. 이제 비트 배열로 이동해 보겠습니다!https://dataonair.or.kr/publishing/img/knowledge/column_img_1534.jpg
실제로 이를 확인해 보겠습니다! C/C++는 이진을 직접 표현할 수 없지만 16진수 표기법으로 비트 배열을 표현할 수 있습니다. 4비트마다 하나의 16비트 숫자로 변경하면 [0xC11B,0000]으로 표현됩니다.

profile
Full-Stack Developer

0개의 댓글