In computer science, primitive data types are a set of basic data types from which all other data types are constructed. Specifically it often refers to the limited set of data representations in use by a particular processor, which all compiled programs must use. Most processors support a similar set of primitive data types, although the specific representations vary. More generally, "primitive data types" may refer to the standard data types built into a programming language (built-in types). Data types which are not primitive are referred to as derived or composite.

Primitive types are almost always value types, but composite types may also be value types.

Common primitive data types

The most common primitive types are those used and supported by computer hardware, such as integers of various sizes, floating-point numbers, and Boolean logical values. Operations on such types are usually quite efficient. Primitive data types which are native to the processor have a one-to-one correspondence with objects in the computer's memory, and operations on these types are often the fastest possible in most cases. Integer addition, for example, can be performed as a single machine instruction, and some offer specific instructions to process sequences of characters with a single instruction. But the choice of primitive data type may affect performance, for example it is faster using SIMD operations and data types to operate on an array of floats.

Integer numbers

An integer data type represents some range of mathematical integers. Integers may be either signed (allowing negative values) or unsigned (non-negative integers only). Common ranges are:

Floating-point numbers

A floating-point number represents a limited-precision rational number that may have a fractional part. These numbers are stored internally in a format equivalent to scientific notation, typically in binary but sometimes in decimal. Because floating-point numbers have limited precision, only a subset of real or rational numbers are exactly representable; other numbers can be represented only approximately. Many languages have both a single precision (often called "float") and a double precision type (often called "double").

Booleans

A boolean type, typically denoted "bool" or "boolean", is typically a logical type that can have either the value "true" or the value "false". Although only one bit is necessary to accommodate the value set "true" and "false", programming languages typically implement boolean types as one or more bytes.

Many languages (e.g. Java, Pascal and Ada) implement booleans adhering to the concept of boolean as a distinct logical type. Some languages, though, may implicitly convert booleans to numeric types at times to give extended semantics to booleans and boolean expressions or to achieve backwards compatibility with earlier versions of the language. For example, early versions of the C programming language that followed ANSI C and its former standards did not have a dedicated boolean type. Instead, numeric values of zero are interpreted as "false", and any other value is interpreted as "true". The newer C99 added a distinct boolean type _Bool (the more intuitive name bool as well as the macros true and false can be included with stdbool.h), and C++ supports bool as a built-in type and "true" and "false" as reserved words.

Specific languages

Java
The Java virtual machine's set of primitive data types consists of:
 byte, short, int, long, char (integer types with a variety of ranges)
 float and double, floating-point numbers with single and double precisions
 boolean, a Boolean type with logical values true and false
 returnAddress, a value referring to an executable memory address. This is not accessible from the Java programming language and is usually left out.

C basic types 

The set of basic C data types is similar to Java's. Minimally, there are four types, char, int, float, and double, but the qualifiers short, long, signed, and unsigned mean that C contains numerous target-dependent integer and floating-point primitive types. C99 extended this set by adding the boolean type _Bool and allowing the modifier long to be used twice in combination with int (e.g. long long int).

XML Schema 

The XML Schema Definition language provides a set of 19 primitive data types:
 string: a string, a sequence of Unicode code points
 boolean: a boolean
 decimal: a number represented with decimal notation
 float and double: floating-point numbers
 duration, dateTime, time, date, gYearMonth, gYear, gMonthDay, gDay, and gMonth: Calendar dates and times
 hexBinary and base64Binary: binary data encoded as hexadecimal or Base64
 anyURI: a URI
 QName: a qualified name
 NOTATION: a QName declared as a notation in the schema. Notations are used to embed non-XML data types. This type cannot be used directly - only derived types that enumerate a limited set of QNames may be used.

JavaScript 

In JavaScript, there are 7 primitive data types: string, number, bigint, boolean, undefined, symbol, and null. These are not objects and have no methods.

Visual Basic .NET 

In Visual Basic .NET, the primitive data types consist of 4 integral types, 2 floating-point types, a 16-byte decimal type, a boolean type, a date/time type, a Unicode character type, and a Unicode string type.

Rust 
Rust has primitive unsigned and signed fixed width integers in the format u or i respectively followed by any bit width that is a power of two between 8 and 128 giving the types u8, u16, u32, u64, u128, i8, i16, i32, i64 and i128. Also available are the types usize and isize which are unsigned and signed integers that are the same bit width as a reference with the usize type being used for indices into arrays and indexable collection types.

Rust also has:

 bool for the boolean type.
 f32 and f64 for 32 and 64-bit floating point numbers.
 char for a unicode character. Under the hood these are unsigned 32-bit integers with values that correspond to the char's codepoint but only values that correspond to a valid unicode scalar value are valid.

Built-in types 

Built-in types are distinguished from others by having specific support in the compiler or runtime, to the extent that it would not be possible to simply define them in a header file or standard library module. Besides integers, floating-point numbers, and Booleans, other built-in types include:
 The void type and null pointer type nullptr_t in C++ and C23
 Characters and strings (see below)
 Ranges (see below)
 Tuple in Standard ML, Python, Scala, Swift, Elixir
 List in Common Lisp, Python, Scheme, Haskell
 Fixed-point number  with a variety of precisions and a programmer-selected scale.
 Complex number in C99, Fortran, Common Lisp, Python, D, Go. This is two floating-point numbers, a real part and an imaginary part.
 Rational number in Common Lisp
 Arbitrary-precision Integer type in Common Lisp, Erlang, Haskell
 Associative arrays, records, and/or sets in Perl, PHP, Python, Ruby, JavaScript, Lua, D, Go
 Reference (also called a pointer or handle or descriptor),
 Symbols, in Lisp
 First-class function, in all functional languages, JavaScript, Lua, D, Go, and in newer standards of C++, Java, C#, Perl

Characters and strings
A character type is a type that can represent all Unicode characters, hence must be at least 21 bits wide. Some languages such as Julia include a true 32-bit Unicode character type as primitive. Other languages such as JavaScript, Python, Ruby, and many dialects of BASIC do not have a primitive character type but instead add strings as a primitive data type, typically using the UTF-8 encoding. Strings with a length of one are normally used to represent single characters.

Some languages have "character" or "string" types that are too small to represent all Unicode characters or strings. These are more properly categorized as integer types. For example C includes a char type, but it is defined to be the smallest addressable unit of memory, which several standards, such as POSIX require to be 8 bits. The recent version of these standards refer to char as a numeric type. char is also used for a 16-bit integer type in Java, but again this is not a Unicode character type. Some computer hardware has a few instructions which deal with "strings", referring to a sequence of bytes. For example, x86-64 can move, set, search, or compare a sequence of items, where an item could be 1, 2, 4, or 8 bytes long.

Ranges
A range numeric data type has its maximum and minimum value embedded in the type. It is included in some languages such as Ada and Pascal. Attempting to store a number outside the range may lead to compiler/runtime errors, or to incorrect calculations (due to truncation) depending on the language being used. In practice the compiler chooses the most appropriate primitive integer or floating-point type automatically.

See also
 Language primitive
 
 Object type
 Primitive wrapper class
 Variable (computer science)

References

External links

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

언어와 그 구현에 따라서, 원시형은 메모리 상에 일대일로 대응되는 개체(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로 구분된다. 일반적인 정수형의 크기는 다음과 같다.

정수를 위한 리터럴(상수)는 숫자로 이뤄진다. 거의 모든 프로그래밍 언어는 자리수를 표시하기 위해 ,(쉼표)를 사용하는 것을 허용하지 않는다. 예외적으로, 포트란은 내장된 공백(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승) 값을 저장할 수 있으며, 여기서 값은 비트수이다.

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

같이 보기 
 자료형

각주 

자료형