**원시 자료형**(primitive data type)은 컴퓨터 과학에서 프로그래밍 언어가 제공하는 자료형 중 하나다. 원시형은 또한 **내장형**이나 **기본형**으로도 불린다.

언어와 그 구현에 따라서, 원시형은 메모리 상에 일대일로 대응되는 개체(Object)를 가질 수도 있다. 일반적으로 원시형은 언어 구조체 중 가장 빨리 연산처리된다. 예를 들어, 정수형의 덧셈은 단 하나의 기계식 연산(machine instruction)으로 처리될 수 있다.일부 중앙 처리 장치(CPU)는 한 번의 연산으로 문자들의 시퀀스 처리를 수행해주는 특별한 연산을 제공한다. 일부 C에서는 "'plain' int 객체는 실행 환경의 아키텍처가 제공하는 기본 사이즈를 갖는다"고 한다. 이것은 `int`는 32-bit 아키텍처에서는 32 bits long과 같은 사이즈를 가질 수 있다는 뜻이다. 원시형의 값은 상태(state)를 공유하지 않는다.

대부분의 언어들은 프로그램에 의한 원시형의 조작을 허용하지 않는다. 스몰토크와 같은 예외적인 언어들은 프로그램 내에서 원시형을 확장할 수 있도록 허용해주기도 한다. 스몰토크에서는 원시형에 대한 연산을 추가하거나 심지어는 빌트인 연산(내장형 연산)을 재정의할 수도 있다.

개요
--

실제 원시형의 범위는 프로그래밍 언어에 따라 다르다. 예를 들어 C에서는 문자열은 조합형이지만, 베이직과 자바스크립트에서는 기본형으로 취급된다.

일반적으로 원시형은 다음과 같다.

* 문자 (`character`, `char`);
* 다양한 산술 정밀도를 갖는 정수 (`integer`, `int`, `short`, `long`, `byte`);
* 부동소수점수 (`float`, `double`, `real`, `double precision`);
* 다양한 정밀도와 프로그래머가 지정 가능한 크기를 갖는 고정소수점수 (`fixed`).
* 불린 '참(true)'과 '거짓(false)' 값을 갖는다.
* 참조 (*포인터* 또는 *핸들*로 불림), 다른 개체(Object)의 메모리상 주소를 참조하는 값.

보다 복잡한 형도 다음과 같은 원시형이 될 수 있다.

* 튜플: ML, 파이썬
* 링크드 리스트: 리스프
* 복소수: 포트란, C (C99), 리스프, 파이썬
* 유리수: 리스프
* 해시 테이블: 리스프, 파이썬, Lua
* First class function, closure, continuation: 리스프, ML와 같은 함수형 프로그래밍 언어

분류
--

### 정수형 숫자

정수형은 소숫점을 제외한 모든 숫자값을 가질 수 있다. 정수형은 (음수형을 가질 수 있는) signed와 음수형을 가질 수 없는 unsigned로 구분된다. 일반적인 정수형의 크기는 다음과 같다.

| 크기 | 이름 | signed | unsigned |
| --- | --- | --- | --- |
| 8 bits | Byte | -128 ~ +127 | 0 ~ 255 |
| 16 bits | Word, short int | -32,768 ~ +32,767 | 0 ~ 65 535 |
| 32 bits | Double Word, long int | -2,147,483,648 ~ +2,147,483,647 | 0 ~ 4,294,967,295 |
| 64 bits | long long (C), long (자바) | –9,223,372,036,854,775,808 ~ +9,223,372,036,854,775,807 | 0 ~ 18,446,744,073,709,551,615 |
| unlimited | Bignum |  |  |

정수를 위한 리터럴(상수)는 숫자로 이뤄진다. 거의 모든 프로그래밍 언어는 자리수를 표시하기 위해 ,(쉼표)를 사용하는 것을 허용하지 않는다. 예외적으로, 포트란은 내장된 공백(embedded space)을 허용하고, 펄(Perl), 루비 그리고 D는 내장된 '\_(밑줄)'을 허용한다. (포트란 77과 포트란 90 이상의 버전에서는 고정 자리수를 지원한다. 하지만 포트란에서도 임의의 자리수를 지정할 수는 없다.) 음수는 숫자값 앞에 음수 기호(-)를 붙여서 표시한다.

정수형 표기법 예:

* 42
* 10000
* -233000

### 불린

일반적으로 "bool"이나 "boolean"으로 표시되는 불린 자료형은 단일비트 타입이다. 그 값은 "true" (1) 또는 "false" (0)로 제한되어 있다. C++과 같은 몇몇 언어에서는 불린값들은 암시적으로 정수형으로 변환될 수 있다. 예를 들어 "true + true"에 대한 연산값은 2일 수 있다. 그러나 자바와 파스칼 같은 다른 언어에서는 이러한 형변환을 허용하지 않는다.

### 부동소수점 수

부동소수점 수는 소수점 값을 포함한 실수를 표현한다. 이 숫자는 지수법, 이진법, 간혹 십진법으로 표기되기도 한다. 부동소수점 수는 제한된 자릿수를 갖기 때문에, 모든 값은 근사적으로 표시된다.

많은 언어들은 "float"라고 부르는 single precision과 double precision 타입을 갖는다.

소수점을 포함한 부동소수점 수를 위한 리터럴은 일반적으로 지수를 표기하기 위해서 "e"를 사용한다. 다음의 부동소수점 표기를 참조.

* 20.0005
* 99.9
* -5000.12
* 6.02e23

포트란 같은 일부 언어에서는 추가로 복소수(complex number) 타입을 갖는다. 이 복소수 타입은 실수부와 허수부으로 이뤄져 있다.

### 고정소수점 수

고정소수점 수는 소수 부분을 갖고 있는 실수를 표현한다. 이 수는 내부적으로 scaled-integer 폼으로, 일반적으로 이진법으로 하지만 가끔 십진법으로 저장된다. 고정소수점 수는 오직 제한된 자릿 수만을 표기할 수 있기 때문에 대부분의 값은 근사적으로만 표기될 수 있다. 고정소수점 수는 제한된 범위의 값을 가지므로 프로그래머는 반드시 그 값이 오버플로우 되지 않도록 주의해야 한다.

### 문자형과 문자열

일반적으로 "char"라 쓰는 문자 타입은 하나의 문자, 숫자, 문장 부호 혹은 제어 문자를 갖는다. 언어에 따라서 아스키 코드(ASCII) 문자를 위한 단일바이트 형과 유니코드 문자를 위한 복수바이트 형을 갖기도 한다. 문자의 조합이 문자열이다. 문자열 데이터는 숫자와 다른 숫자 기호를 가질 수 있지만 (숫자형이 아닌) 텍스트형으로 처리된다.

대부분의 언어에서 문자열은 문자의 배열(array)와 동치이나, 자바에서는 별개의 타입으로 처리된다. (파이썬과 베이직의 표기방법) 같은 그 밖의 언어에서는 별도의 문자형은 없다.

문자와 문자열을 위한 표기 방법은 따옴표로 해당 문자를 감싸는 것이 보통이다. 종종, 문자는 작은 따옴표로 문자열은 큰 따옴표로 감싼다.

C에서의 문자 표기법

* 'A'
* '4'
* '$'
* '\t' (탭 문자)

C에서의 문자열 표기법

* "A"
* "Hello World"
* "I am 6000 years old"

### 숫자형 데이터의 범위

각 숫자형 데이터는 최솟값과 최댓값으로 제한된 범위를 갖는다. 제한된 범위를 넘어서는 숫자가 생긴다면 컴파일 에러나 런타임 에러를 마주하게 되거나, 운이 없다면 (버림 처리로 인한) 잘 못된 연산값을 얻게 될 것이다. 이는 사용된 언어에 따라 결정된다.

변수의 범위는 그 값을 저장하기 위해 사용되는 바이트 수에 따라 달라진다. 정수형 데이터는 일반적으로 (2의 n승) 값을 저장할 수 있으며, 여기서 n값은 비트수이다.

부동소수점 값과 같은 다른 데이터형을 위한 범위는 더 복잡해지며 보다 그 값을 저장하는 방식에 따라 많이 달라진다. 여기에서도 역시 모든 바이트를 사용하지 않는 데이터형이 있다. 예를 들어 불린은 (비록 일 바이트를 차지하고 나머지 일곱 비트를 낭비하긴 하지만,) 단 하나의 비트만 필요로하고 이진법 값을 표현한다. Ada와 파스칼과 같은 일부 언어에서는 정반대의 접근방식을 허용하기도 한다. 즉, 프로그래머는 숫자의 범위와 주어진 문제를 해결하기 위한 정밀도를 정의하고, 컴파일러는 가장 적절한 정수나 부동 소수형을 자동으로 적용한다.