파게로그

자료형 본문

콤퓨타 왕기초/C

자료형

파게 2021. 3. 8. 04:22

char

short

int

long

float

double

long double

 


 

 

char

 

char ch1 = 'a' // 97 'a'
char ch2 = ch1 + 1; // 98 'b'
char ch3 = 99; // 99 'c'

표준

최소 8비트인 정수형

 

char에 대해 새롭게 알게 된 사실

· C 표준에서 1byte란 8bit가 아니라 CHAR_BIT로 정의된다.

· char는 기기에서 접근할 수 있는 가장 작은 단위이다.

 

 포팅 문제 없는 값의 범위

· unsigned char: 0 ~ 255

· char: 0 ~ 127

· signed char: -127 ~ 127

 

 표준과 무관하게 일반적으로 사용되는 값의 범위

· unsigned char: 0 ~ 255

· char: signed

· signed char: -128 ~ 127

 

 C 표준에서 1byte란 8bit가 아니라 CHAR_BIT이다.

 char는 기기에서 접근할 수 있는 가장 작은 단위

일반적으로 char는 8bit로 사용된다.

포팅 문제 없는 값의 범위에서 -128이 포함되지 않는 것은, 아주 일부의, 1의 보수를 쓰는 시스템이 있을 수도 있기 때문이다.

 

char는 정수형으로서 ASCII 문자를 표현하기에 충분. 아스키는 0~127의 숫자(7비트)

(가장 앞 부호비트를 쓰고있지 않는 느낌...)

signed/unsigned를 명시하지 않으면... → 정의되어 있지 않음. 컴파일러 구현을 따라 정해짐.

(Clang Windows에선 signed)

8비트 정수형으로 쓸때는 char 앞에 signed/unsigned를 명시하는 편이 좋다.

(명시하지 않으면 0~127(00000000~01111111)만 안전하게 사용 가능)

 

• char가 몇 비트인지 알아보기: <limits.h> include 후 CHAR_BIT 확인 // 보통 8 '\b'

char의 부호 여부 판단하기: <limits.h>에서 CHAR_MIN을 확인... 0이면 unsigned, SCHAR_MIN이면 signed

 

MSVC의 <limits.h>


 

short

 

 표준

최소 16비트, char의 크기 이상인 정수형

 

 포팅 문제 없는 값의 범위

unsigned short: 0 ~ 65,535

signed short: -32,767 ~ 32,767

 

 표준과 무관하게 일반적으로 사용되는 값의 범위

unsigned short: 0 ~ 65,535

signed short: -32,768 ~ 32,767

 

 보통은 int보다 짧음 (메모리를 절약할 수 있지만 성능을 희생해야 할 수도 있음)

 


 

int

 

- 표준

최소 16비트, short의 크기 이상인 정수형

 

- CPU에게 앞뒤 생략하고 '정수 처리해!' 라고 하면 CPU가 딱 아는 크기여야 함

-> CPU의 산술논리장치(ALU, Arithmetic Logic Unit)가 사용하는 기본 데이터

-> 이 데이터를 워드(word)라 하고, 그 크기를 워드 크기라고 함

-> 워드 크기는 레지스터 크기와 일치

-> 즉 CPU마다 다르고.. 예전에는 16비트 CPU가 흔했어서 최소 16비트 기준인 것

 

- 지금은 64비트 컴퓨터... 하지만 int는 여전히 32bit

-> 원칙적으로는 C 표준 어긴 것

-> 64비트로 올리면 32비트 정수를 어떻게 표현하지?

-> 너무 오랫동안 32비트를 int의 크기로 사용

-> 32비트에서 64비트로 바꾼다고 성능이 무조건 빨라지지는 않음(ex 캐시메모리 등)

 

- 포팅 문제 없는 값의 범위

short와 같음

 

- 표준과 무관하게 일반적으로는...

unsigned int: 0 ~ 4,294,967,295

signed int: -2,147,483,648 ~ 2,147,483,647

 

- int의 리터럴

'u' or 'U': unsigned 수를 표현하는 접미사 (일반적으로 소문자를 더 많이 씀)

: 부호 있는 수의 최댓값보다 큰 값을 unsigned int에 대입할 경우 붙여야 함

: 안 붙이면 warning 발생

-> unsigned int u1 = 300; // ok

-> unsigned int u2 = 2147483648; // warning occurs

-> unsigned int u3 = 2147483648u; // no warning occurs

 


 

long

 

int가 16비트일 때 그것보다 2배 큰 자료형이 필요했음

long은 최소 32비트이고 int 이상의 크기인 정수형... 사실상 int...

(다른 언어에서는 보통 long은 64비트)

 

최소 64비트인 정수형 -> C89에는 없음

포팅 안전한 범위 : -2147483647~2147483647

- 일반적으로는... int와 같음;;

 

long의 리터럴

'l' or 'L': long을 의미하는 접미사

'u' or 'U': 부호 없는(unsigned) 수를 표현하는 접미사

두 접미사를 같이 쓸 수 있음: UL/LU/lu/ul 주로 UL, ul 많이 씀

 


 

float

 

부동소수점 자료형은 IEEE 754로 대동단결...! (float: IEEE 754 single: 32bit/  double: IEEE 754 double: 64bit)

but C는 CPU가 IEEE 754를 지원하는 실수 계산 장치를 장착하기 이전부터 쓰였기에...

 

float num = 3.14f; // ok

unsigned float num1 = 3.14f; // 컴파일 에러

signed float num2 = -3.14f;   // 컴파일 에러

 

- C표준에 따르면...

->float는 IEEE 754를 따를 수도, 그러지 않을 수도 있음 - 컴파일러 구현에 따라 다름

(크기는 char 이상이기만 하면 됨)

-> unsigned형 없음

 

- 일반적으로는...

크기:32비트 / 범위:IEEE 754 single과 동일

 

- 관련 헤더파일: float.h

 

- 리터럴

float pi1 = 3.14f;   // ok

float pi2 = 3.14uf;  // 컴파일 에러. 접미사 u를 사용하지않는다

-> 'f' or 'F': float를 의미하는 접미사 (보통 'f')  3.0f, 3.f 중엥서는 3.f를 더 많이쓴다

 


 

double

 

표준에 따르면... CPU가 계산에 사용하는 기본 데이터 크기, float 이상 크기...

float는 double보다 빠른 연산을 위해 만든 작은 부동소수점

-> 컴파일러 구현마다 다름 (IEEE 754 Double이라는 보장이 없음)

unsigned형 없음

 

double num = 3.14;  //ok

unsigned double ud = 3.14;   // 컴파일에러(unsigned x)

signed double sd = -3.14;  // 컴파일에러(signed x)

 

- 표준과 관계없이 일반적으로는..

크기: 64비트 / 범위: IEEE 754 Double과 동일 / 관련헤더파일: float.h

 


 

long double

 

- double보다 높은 정밀도 (일반적으로는 double과 long double이 같음)

- double 이상의 크기면 됨

- unsigned형 없음

- 관련헤더파일: float.h

 


 

unsigned, signed

char 제외하고는 생략 시 signed가 기본

 

 

- 데스크톱에서

long(32bit)을 제외하고는 대개 다른 언어와 비슷하게 사용 가능

 

- 소형기기에서

매뉴얼에서 자료형 크기 확인 후 사용

 

- 범용적인 코드라면

포팅이 보장되는 범위의 값으로만 사용할 것

float, double은 플랫폼 사이에 값이 정확히 일치하지 않을 수 있음 (비트패턴에 의존하지 말 것)

 


 

bool

 

없으며, 0, 1로 표현함

 

 

'콤퓨타 왕기초 > C' 카테고리의 다른 글

C89(C90)에서의 변수 선언 위치  (0) 2021.03.09
열거형  (0) 2021.03.09
C89에서의 주석  (0) 2021.03.08
main 함수  (0) 2021.03.08
큰 그림  (0) 2021.03.08
Comments