정수형
1. 개요
정수형은 컴퓨터에서 정수를 표현하는 데 사용되는 자료형으로, 부호 있는 정수와 부호 없는 정수로 구분된다. 부호 있는 정수는 음수, 0, 양수를 모두 표현하며, 2의 보수 방식을 사용하여 음수를 나타낸다. 부호 없는 정수는 0과 양수만 표현한다. 정수형은 비트 수에 따라 표현할 수 있는 값의 범위가 다르며, 프로그래밍 언어에 따라 다양한 크기의 정수 자료형을 제공한다. C, C++, Java, C#, Python 등 여러 프로그래밍 언어에서 정수형을 지원하며, 각 언어는 고정 길이 정수형과 가변 길이 정수형을 제공한다.
이미지 준비중입니다.
| 종류 | 기본형 |
|---|---|
| 표현 | 부호 있는 정수 부호 없는 정수 |
| 일반적인 크기 | 2 바이트 4 바이트 8 바이트 |
| C# | sbyte byte short ushort int uint long ulong char |
|---|---|
| C++ | signed char unsigned char short unsigned short int unsigned int long unsigned long long long unsigned long long wchar_t char16_t char32_t |
| 자바 | byte short int long char |
| 관련 주제 | 부동소수점 자료형 (프로그래밍) Boolean (자료형) |
|---|
-
원시 자료형 -
참조
참조는 프로그래밍에서 메모리 주소나 다른 데이터를 가리키는 값으로, 데이터의 효율적인 전달과 공유를 위해 사용되며, 포인터, 파일 핸들, URL 등이 그 예시이다. -
원시 자료형 -
문자열
문자열은 사람이 읽을 수 있는 텍스트를 저장하고 정보를 전달하거나 받는 데 사용되는 순서가 있는 문자들의 시퀀스로, 다양한 형태의 데이터를 표현하며 유한한 길이를 가지고, 프로그래밍 언어에서 기본 또는 복합 자료형으로 제공되고, 문자 집합과 인코딩 방식에 따라 표현 방식이 달라진다. -
컴퓨터 산술 -
IEEE 754
IEEE 754는 부동소수점 숫자를 표현하고 처리하기 위한 국제 표준으로, 다양한 형식과 연산, 반올림 규칙, 예외 처리 등을 정의한다. -
컴퓨터 산술 -
1의 보수
1의 보수는 이진수에서 양수는 일반적인 이진수로, 음수는 양수의 각 비트를 반전시켜 표현하며, 덧셈 시 자리올림수가 발생하면 결과값에 더해야 하고, 0을 중복 표현하는 단점으로 현대에는 2의 보수가 주로 사용된다. -
자료형 -
참조
참조는 프로그래밍에서 메모리 주소나 다른 데이터를 가리키는 값으로, 데이터의 효율적인 전달과 공유를 위해 사용되며, 포인터, 파일 핸들, URL 등이 그 예시이다. -
자료형 -
익명 함수
익명 함수는 이름이 없는 함수로, 람다 추상, 람다 함수, 람다 표현식, 화살표 함수 등으로 불리며, 함수형 프로그래밍 언어에서 람다식 형태로 많이 사용되고 고차 함수의 인수, 클로저, 커링 등에 활용되지만, 재귀 호출의 어려움이나 기능 제한과 같은 단점도 존재한다.
2. 종류
컴퓨터에서 사용되는 정수 자료형은 크게 부호 있는 정수와 부호 없는 정수로 나뉜다.
정수형의 값은 해당 항목이 나타내는 수학적 정수이다. 정수형은 음이 아닌 정수만 표현 가능한 부호 없는 유형 또는 음수도 표현 가능한 부호 있는 유형이 될 수 있다.
정수 값은 일반적으로 프로그램의 소스 코드에서 + 또는 − 부호를 선택적으로 앞에 붙인 일련의 숫자로 지정된다. 일부 프로그래밍 언어는 16진수(16진법) 또는 8진수(8진법)와 같은 다른 표기법을 허용하며, 숫자 그룹 구분 기호를 허용하는 경우도 있다.
이 데이터의 내부 표현은 컴퓨터의 메모리에 값이 저장되는 방식이다. 수학적 정수와 달리 컴퓨터의 일반적인 데이터는 최소값과 최대값을 갖는다. 양의 정수의 가장 일반적인 표현은 이진법을 사용하는 비트 문자열이다. 비트를 저장하는 메모리 바이트의 순서는 다양하다. (엔디안 참조) 정수형의 너비, 정밀도 또는 비트 크기는 표현의 비트 수이다.
부호 있는 숫자를 나타내는 방법에는 네 가지가 있는데, 가장 일반적인 방법은 2의 보수이다.
일부 컴퓨터 언어는 머신 독립적인 방식으로 정수 크기를 정의하고, 다른 언어는 기본 프로세서 워드 크기에 따라 다양한 정의를 갖는다. 하나의 프로그래밍 언어의 정수는 다른 언어나 프로세서, 또는 다른 비트 크기의 실행 컨텍스트에서 크기가 다를 수 있다.
일부 구형 컴퓨터 아키텍처는 2진화 십진법(BCD) 또는 기타 형식으로 저장된 정수의 십진수 표현을 사용했다.
| 비트 수 | 이름 | 범위 (부호 있는 숫자 표현에 2의 보수를 사용한다고 가정) | 십진수 자릿수 | 용도 | C/C++ | C# | 파스칼 및 델파이 | 자바 | SQL | 포트란 | D | 러스트 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 4 | 니블, 반옥텟 | 부호 있음: −8에서 7까지 | 2진화 십진법, 단일 십진수 | — | ||||||||
| 부호 없음: 0에서 15까지 | ||||||||||||
| 8 | 바이트, 옥텟, i8, u8 | 부호 있음: −128에서 127까지 | ASCII 문자, UTF-8의 코드 단위 | int8_t, signed char | sbyte | Shortint | byte | tinyint | byte | i8 | ||
| 부호 없음: 0에서 255까지 | uint8_t, unsigned char | byte | Byte | unsigned tinyint | ubyte | u8 | ||||||
| 16 | halfword, 워드, short, i16, u16 | 부호 있음: −32,768에서 32,767까지 | UCS-2 문자, UTF-16의 코드 단위 | int16_t, short | short | Smallint | short | smallint | short | i16 | ||
| 부호 없음: 0에서 65,535까지 | uint16_t, unsigned | ushort | Word | char | unsigned smallint | ushort | u16 | |||||
| 32 | 워드, long, doubleword, longword, int, i32, u32 | 부호 있음: −2,147,483,648에서 2,147,483,647까지 | UTF-32 문자, 알파 채널을 포함한 트루 컬러, FourCC, 32비트 컴퓨팅에서의 포인터 | int32_t, int, long | int | LongInt, Integer | int | int | int | i32 | ||
| 부호 없음: 0에서 4,294,967,295까지 | uint32_t, unsigned int, unsigned long | uint | LongWord, Cardinal | unsigned int | uint | u32 | ||||||
| 64 | 워드, doubleword, longword, long, long long, quad, quadword, qword, int64, i64, u64 | 부호 있음: −9,223,372,036,854,775,808에서 9,223,372,036,854,775,807까지 | 시간 (예: 유닉스 에포크 이후의 밀리초), 64비트 컴퓨팅에서의 포인터 | int64_t, long, long long | long | Int64 | long | bigint | long | i64 | ||
| 부호 없음: 0에서 18,446,744,073,709,551,615까지 | uint64_t, unsigned long long | ulong | UInt64, QWord | unsigned bigint | ulong | u64 | ||||||
| 128 | octaword, double quadword, i128, u128 | 부호 있음: −170,141,183,460,469,231,731,687,303,715,884,105,728에서 170,141,183,460,469,231,731,687,303,715,884,105,727까지 | 복잡한 과학적 계산, IPv6 주소, GUID | 비표준 또는 컴파일러 특정 확장으로만 사용 가능 | cent | i128 | ||||||
| 부호 없음: 0에서 340,282,366,920,938,463,463,374,607,431,768,211,455까지 | ucent | u128 | ||||||||||
| n | n-비트 정수 (일반적인 경우) | 부호 있음: −(2n−1)에서 (2n−1 − 1)까지 | C23: _BitInt(n), signed _BitInt(n) | Ada: range -2(n-1)..2(n-1)-1 | ||||||||
| 부호 없음: 0에서 (2n − 1)까지 | C23: unsigned _BitInt(n) | Ada: range 0..2n-1, mod 2n; 표준 라이브러리 또는 많은 언어 (예: Python, C++ 등)의 타사 임의 산술 라이브러리의 BigDecimal 또는 Decimal 클래스 | ||||||||||
2.1. 부호 있는 정수 (Signed Integer)
음수, 0, 양수를 모두 표현할 수 있는 정수 자료형이다. 일반적으로 2의 보수 방식을 사용하여 음수를 표현한다. 표현 범위는 -(2^(n-1))부터 2^(n-1)-1까지이다. (n은 비트 수)
2의 보수 연산은 표현과 값 사이에 완벽한 일대일 대응이 있고(특히 별도의 +0과 −0 없음) 덧셈, 뺄셈 및 곱셈이 부호 있는 유형과 부호 없는 유형을 구별할 필요가 없기 때문에 편리하다. 다른 가능성으로는 바이어스 표현, 부호-크기, 1의 보수가 있다.
| 비트 | 이름 | 범위 | 십진법 (대략값) | 이용 | C/C++ | C# | 델파이 | 자바 | SQL |
|---|---|---|---|---|---|---|---|---|---|
| 4 | nibble, semioctet | Signed: -8 ~ 7 | 1 | binary-coded decimal, single decimal로 표현. | |||||
| 8 | byte, octet | Signed: -128 ~ 127 | 3 | 아스키 문자 | int8_t, char | sbyte | Shortint | byte | tinyint |
| 16 | halfword, word, short | Signed: -32,768 ~ 32,767 | 5 | UCS-2 문자 | int16_t, short | short | Smallint | short | smallint |
| 32 | word, long, doubleword, longword, int | Signed: -2,147,483,648 ~ 2,147,483,647 | 10 | UCS-4 문자, 트루컬러 + 알파, FourCC, 액션스크립트 int | int32_t, int, long | int | LongInt; Integer | int | int |
| 64 | word, doubleword, longword, long long, quad, quadword, int64 | Signed: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 19 | 매우 큰 수 | int64_t, long, long long | long | Int64 | long | bigint |
| 128 | octaword, double quadword | Signed: -170,141,183,460,469,231,731,687,303,715,884,105,728 ~ 170,141,183,460,469,231,731,687,303,715,884,105,727 | 39 | C: 비표준 컴파일러 확장으로만 사용 가능 | |||||
| n | n-bit integer (일반적인 경우) | Signed: (-2^(n-1)) ~ (2^(n-1) -1) | 에이다 `범위 -2(n-1)..2(n-1)-1` | ||||||
2.2. 부호 없는 정수 (Unsigned Integer)
Unsigned Integer영어는 0과 양수만을 표현할 수 있는 정수 자료형이다. 표현 범위는 0부터 까지이다. (n은 비트 수)
다음은 부호 없는 정수형의 비트 수에 따른 표현 범위와 주요 용도를 나타낸 표이다.
| 비트 | 이름 | 범위 | 십진법 (대략값) | 이용 | C/C++ | C# | 델파이 | 자바 | SQL |
|---|---|---|---|---|---|---|---|---|---|
| 4 | nibble, semioctet | 0 ~ 15 | 2 | binary-coded decimal, single decimal로 표현. | |||||
| 8 | byte, octet | 0 ~ 255 | 3 | 아스키 문자 | uint8_t, char | byte | Byte | n/a | unsigned tinyint |
| 16 | halfword, word, short | 0 ~ 65,535 | 5 | UCS-2 문자 | uint16_t | ushort | Word | char | unsigned smallint |
| 32 | word, long, doubleword, longword, int | 0 ~ 4,294,967,295 | 10 | UCS-4 문자, 트루컬러 + 알파, FourCC, 액션스크립트 int | uint32_t | uint | LongWord; Cardinal | n/a | unsigned int |
| 64 | word, doubleword, longword, long long, quad, quadword, int64 | 0 ~ 18,446,744,073,709,551,615 | 20 | 매우 큰 수 | uint64_t | ulong | n/a | n/a | unsigned bigint |
| 128 | octaword, double quadword | 0 ~ 340,282,366,920,938,463,463,374,607,431,768,211,455 | 39 | C: 비표준 컴파일러 확장으로만 사용 가능 | |||||
| n | n-bit integer (일반적인 경우) | 0 ~ | 에이다 `범위 0..2n-1`, 에이다 `mod 2n` |
2.3. 고정 길이 및 가변 길이 정수
대부분의 프로그래밍 언어는 8비트, 16비트, 32비트, 64비트 등 특정 비트 수의 정수 자료형을 제공하는데, 이를 고정 길이 정수라고 한다. 이러한 자료형은 표현할 수 있는 정수의 범위에 제한이 있다. 예를 들어, 부호 없는 8비트 정수는 0부터 255까지, 부호 있는 8비트 정수는 -128부터 127까지의 값을 표현할 수 있다. 2의 보수를 사용하면 n 비트의 부호 있는 정수형은 -2(n-1)부터 2(n-1) - 1까지의 숫자를 나타낼 수 있다.
일부 프로그래밍 언어는 임의의 크기를 가진 정수를 표현할 수 있는 자료형을 지원하는데, 이를 가변 길이 정수라고 한다. Python의 `int`와 Java의 `BigInteger`가 대표적이다. 이러한 자료형은 메모리가 허용하는 한 매우 큰 정수도 표현할 수 있어, 오버플로우 걱정 없이 연산할 수 있다.
다음은 일반적인 고정 길이 정수 자료형의 종류와 범위를 나타내는 표이다.
| 비트 | 이름 | 범위 (부호 있음) | 범위 (부호 없음) | C/C++ | C# | 델파이 | 자바 | SQL |
|---|---|---|---|---|---|---|---|---|
| 4 | 니블 | -8 ~ 7 | 0 ~ 15 | |||||
| 8 | byte, octet | -128 ~ 127 | 0 ~ 255 | int8_t, char | sbyte | Shortint | byte | tinyint |
| 16 | halfword, word, short | -32,768 ~ 32,767 | 0 ~ 65,535 | int16_t, short | short | Smallint | short | smallint |
| 32 | word, long, doubleword, longword, int | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | int32_t, int, long | int | LongInt; Integer | int | int |
| 64 | word, doubleword, longword, long long, quad, quadword, int64 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 ~ 18,446,744,073,709,551,615 | int64_t, long, long long | long | Int64 | long | bigint |
| 128 | octaword, double quadword | -170,141,183,460,469,231,731,687,303,715,884,105,728 ~ 170,141,183,460,469,231,731,687,303,715,884,105,727 | 0 ~ 340,282,366,920,938,463,463,374,607,431,768,211,455 | C: 비표준 컴파일러 확장으로만 사용 가능 | ||||
C 언어와 C++에서는 `short`, `int`, `long` 등의 정수형을 제공하며, 각 자료형의 크기는 컴파일러와 플랫폼에 따라 다를 수 있다. C99/C++11 표준에서는 `int64_t`와 같이 비트 폭을 명시한 고정 폭 정수형을 도입하여 이식성을 높였다. Java나 C#과 같은 언어는 처음부터 각 내장 정수형의 비트 폭과 내부 표현을 표준 사양으로 규정하고 있다.
3. 표현 방식
정수형의 값은 해당 항목이 나타내는 수학적 정수이다. 정수형은 음이 아닌 정수만 표현 가능한 '부호 없는' 유형과 음수도 표현 가능한 '부호 있는' 유형이 있다.
정수 값은 프로그램의 소스 코드에서 + 또는 − 부호가 선택적으로 앞에 붙는 일련의 숫자로 지정된다. 16진법 또는 8진법과 같은 다른 표기법을 허용하는 프로그래밍 언어도 있으며, 숫자 그룹 구분 기호를 허용하는 경우도 있다.
데이터의 내부 표현은 컴퓨터의 메모리에 값이 저장되는 방식이다. 수학적 정수와 달리 컴퓨터의 일반적인 데이터는 최소값과 최대값을 갖는다.
양의 정수의 가장 일반적인 표현은 이진법을 사용하는 비트 문자열이다. 비트를 저장하는 메모리 바이트의 순서는 다양한데, 이는 엔디안을 참조하면 된다. 정수형의 너비, 정밀도 또는 비트 크기는 표현의 비트 수이다. n 비트의 정수형은 2n개의 숫자를 인코딩할 수 있다. 예를 들어 부호 없는 유형은 일반적으로 0부터 2n − 1까지의 음이 아닌 값을 나타낸다. 정수 값을 비트 패턴으로 인코딩하는 다른 방법으로는 2진화 십진법, 그레이 코드가 사용되거나 ASCII와 같은 인쇄된 문자 코드로 사용되기도 한다.
현대 사용법에서 "바이트"는 거의 항상 8비트를 의미하며, 다른 모든 크기는 사용되지 않기 때문에 "바이트"는 "옥텟"과 동의어가 되었다.
3.1. 2의 보수 (Two's Complement)
대부분의 컴퓨터 시스템에서 부호 있는 정수를 표현하는 데 사용되는 방식이다. 최상위 비트(MSB)가 부호를 나타내며, 0은 양수, 1은 음수를 의미한다. 음수는 해당 양수의 2의 보수를 취하여 표현한다. 2의 보수를 사용하면 덧셈, 뺄셈 연산을 간단하게 처리할 수 있다.
2의 보수는 n 비트의 부호 있는 정수형이 -2(n-1)부터 2(n-1) - 1까지의 숫자를 나타낼 수 있게 한다. 2의 보수 연산은 표현과 값 사이에 완벽한 일대일 대응이 있고(특히 별도의 +0과 -0 없음) 덧셈, 뺄셈 및 곱셈이 부호 있는 유형과 부호 없는 유형을 구별할 필요가 없기 때문에 편리하다. 이진 컴퓨팅 시스템에서 부호 있는 숫자를 나타내는 방법에는 2의 보수 외에도 바이어스 표현, 부호-크기, 1의 보수가 있다.
3.2. 기타 표현 방식
부호 있는 숫자를 나타내는 방법에는 여러 가지가 있다. 일반적인 방법은 2의 보수인데, 이를 통해 n 비트의 부호 있는 정수형이 -2(n-1)부터 2(n-1) - 1까지의 숫자를 나타낼 수 있다. 2의 보수 연산은 표현과 값 사이에 일대일 대응이 있고(특히 별도의 +0과 -0 없음) 덧셈, 뺄셈 및 곱셈이 부호 있는 유형과 부호 없는 유형을 구별할 필요가 없기 때문에 편리하다. 다른 가능성으로는 바이어스 표현, 부호-크기, 1의 보수가 있다.
* 부호-크기 (Sign-Magnitude): 최상위 비트를 부호 비트로 사용하고 나머지 비트로 크기를 나타내는 방식이다.
* 1의 보수 (Ones' Complement): 양수의 모든 비트를 반전시켜 음수를 표현하는 방식이다.
* [[2진화 십진법]](BCD, Binary-Coded Decimal): 4개의 비트를 사용하여 십진수 한 자리를 표현하는 방식이다. 일부 구형 컴퓨터 아키텍처는 BCD 또는 기타 형식으로 저장된 정수의 십진수 표현을 사용했다.
4. 범위
정수 자료형의 범위는 사용하는 비트 수에 따라 결정된다. 다음은 일반적인 정수 자료형의 범위이다.
| 비트 수 | 이름 | 범위 (2의 보수 사용) | 십진수 자릿수 | 용도 |
|---|---|---|---|---|
| 4 | 니블, 반옥텟 | 부호 있음: −8 ~ 7 | 2진화 십진법, 단일 십진수 표현 | |
| 부호 없음: 0 ~ 15 | ||||
| 8 | 바이트, 옥텟 | 부호 있음: −128 ~ 127 | ASCII 문자, UTF-8의 코드 단위 | |
| 부호 없음: 0 ~ 255 | ||||
| 16 | halfword, 워드, short | 부호 있음: −32,768 ~ 32,767 | UCS-2 문자, UTF-16의 코드 단위 | |
| 부호 없음: 0 ~ 65,535 | ||||
| 32 | 워드, long, doubleword, longword, int | 부호 있음: −2,147,483,648 ~ 2,147,483,647 | UTF-32 문자, 알파 채널을 포함한 트루 컬러, FourCC, 32비트 컴퓨팅에서의 포인터 | |
| 부호 없음: 0 ~ 4,294,967,295 | ||||
| 64 | 워드, doubleword, longword, long long, quad, quadword | 부호 있음: −9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 유닉스 에포크 이후의 밀리초, 64비트 컴퓨팅에서의 포인터 | |
| 부호 없음: 0 ~ 18,446,744,073,709,551,615 | ||||
| 128 | octaword, double quadword | 부호 있음: −170,141,183,460,469,231,731,687,303,715,884,105,728 ~ 170,141,183,460,469,231,731,687,303,715,884,105,727 | 복잡한 과학적 계산, IPv6 주소, GUID | |
| 부호 없음: 0 ~ 340,282,366,920,938,463,463,374,607,431,768,211,455 | ||||
| n | n-비트 정수 (일반적인 경우) | 부호 있음: −(2n−1) ~ (2n−1 − 1) | ||
| 부호 없음: 0 ~ (2n − 1) |
5. 프로그래밍 언어별 정수 자료형
다양한 프로그래밍 언어에서 정수 자료형을 지원하며, 언어별로 자료형의 이름, 크기, 표현 방식 등이 다를 수 있다.
| 비트 | 이름 | 범위 | 십진법 (대략값) | 이용 | C/C++ | C# | 델파이 | 자바 | SQL |
|---|---|---|---|---|---|---|---|---|---|
| 4 | nibble, semioctet | Signed: ~ | 1 | binary-coded decimal, single decimal로 표현. | 해당 자료형 없음 | ||||
| Unsigned: ~ | |||||||||
| 8 | byte, octet | Signed: ~ | 3 | 아스키 문자 | int8_t, char | sbyte | Shortint | byte | tinyint |
| Unsigned: ~ | uint8_t, char | byte | Byte | n/a | unsigned tinyint | ||||
| 16 | halfword, word, short | Signed: ~ | 5 | UCS-2 문자 | int16_t, short | short | Smallint | short | smallint |
| Unsigned: ~ | uint16_t | ushort | Word | char | unsigned smallint | ||||
| 32 | word, long, doubleword, longword, int | Signed: ~ | 10 | UCS-4 문자, 트루컬러 + 알파, FourCC, 액션스크립트 int | int32_t, int, long | int | LongInt; Integer | int | int |
| Unsigned: ~ | uint32_t | uint | LongWord; Cardinal | n/a | unsigned int | ||||
| 64 | word, doubleword, longword, long long, quad, quadword, int64 | Signed: ~ | 19 | 매우 큰 수 | int64_t, long, long long | long | Int64 | long | bigint |
| Unsigned: ~ | uint64_t | ulong | n/a | n/a | unsigned bigint | ||||
| 128 | octaword, double quadword | Signed: ~ | 39 | C: 비표준 컴파일러 확장으로만 사용 가능 | |||||
| Unsigned: ~ | |||||||||
| n | n-bit integer (일반적인 경우) | Signed: ~ | 에이다 range -2(n-1)..2(n-1)-1 | ||||||
| Unsigned: 0 ~ | |||||||||
일반적으로 하드웨어는 부호 있는 형식과 부호 없는 형식을 모두 지원하지만, 너비는 작고 고정된 집합이다. 고급 프로그래밍 언어는 더 많은 가능성을 제공하는데, 최대 하드웨어 지원 형식보다 두 배의 비트를 갖는 '더블 너비' 정수형이 있는 것이 일반적이다. 많은 언어에는 비트 필드 형식 (지정된 비트 수, 일반적으로 최대 하드웨어 지원 너비보다 작게 제한됨)과 범위 형식 (지정된 범위의 정수만 표현할 수 있음)이 있다.
Lisp, Smalltalk, REXX, Haskell, 파이썬, Raku와 같은 일부 언어는 임의 정밀도 정수 (무한 정밀도 정수 또는 bignums라고도 함)를 지원한다.
부울 또는 플래그 유형은 0과 1, 일반적으로 각각 거짓과 참의 두 값만 나타낼 수 있는 형식이다. 이 형식은 단일 비트를 사용하여 메모리에 저장할 수 있지만 주소 지정의 편의성과 접근 속도를 위해 종종 전체 바이트가 제공된다.
5.1. C/C++
C/C++ 언어는 `char`, `int`, `long` 등의 키워드를 사용하여 정수형을 구현한다. C 언어는 CPU의 장점을 살려 기계어로 컴파일되기 때문에 CPU의 데이터 처리 비트와 부호를 다양하게 반영하며, 이를 위해 다양한 키워드를 제공한다.
`char`을 사용한 정수형은 1바이트로 고정되지만, `int`는 CPU마다 다른 비트 수를 가진다. 따라서 개발자는 사용하는 CPU와 컴파일러의 사양을 확인하여 비트 수를 인식해야 한다.
8비트 CPU의 일반적인 처리 비트 수
| 자료형 | 비트 수 |
|---|---|
| `char` | 8비트 |
| `int` | 16비트 |
| `long int` | 32비트 |
32비트 CPU의 일반적인 처리 비트 수
| 자료형 | 비트 수 |
|---|---|
| `char` | 8비트 |
| `short` | 16비트 |
| `int` | 32비트 |
| `long long` | 64비트 |
정수형 부호 지정
* `signed char` 또는 `signed int`: 부호를 갖는 정수형으로 2의 보수 체계를 사용한다.
* `unsigned char` 또는 `unsigned int`: 부호가 없는 정수형으로 이진법과 같은 수의 배치를 갖는다.
C99 및 C++11부터는 `int8_t`, `uint16_t` 등 고정 폭 정수 자료형도 지원한다.
| 비트 수 | 이름 | 범위 (부호 있는 숫자 표현에 2의 보수를 사용한다고 가정) | C/C++ |
|---|---|---|---|
| 8 | 바이트, 옥텟 | 부호 있음: −128에서 127까지 | `int8_t`, `signed char` |
| 부호 없음: 0에서 255까지 | `uint8_t`, `unsigned char` | ||
| 16 | halfword, 워드, short | 부호 있음: −32,768에서 32,767까지 | `int16_t`, `short` |
| 부호 없음: 0에서 65,535까지 | `uint16_t` | ||
| 32 | 워드, long, doubleword, longword, int | 부호 있음: −2,147,483,648에서 2,147,483,647까지 | `int32_t`, `int`, `long` |
| 부호 없음: 0에서 4,294,967,295까지 | `uint32_t`, `unsigned int`, `unsigned long` | ||
| 64 | 워드, doubleword, longword, long, long long, quad, quadword, qword, int64 | 부호 있음: -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807까지 | `int64_t`, `long`, `long long` |
| 부호 없음: 0에서 18,446,744,073,709,551,615까지 | `uint64_t`, `unsigned long long` | ||
| n | n-비트 정수 (일반적인 경우) | 부호 있음: −(2n−1)에서 (2n−1 − 1)까지 | C23: `_BitInt(n)`, `signed _BitInt(n)` |
| 부호 없음: 0에서 (2n − 1)까지 | C23: `unsigned _BitInt(n)` |
5.2. Java
자바는 C언어와 달리 특정 CPU에 맞춰 컴파일되지 않고, 모든 CPU에서 실행 가능한 바이트코드 형태의 중간 실행 파일을 생성한다. C언어가 CPU에 따라 정수형 비트 수를 다르게 사용하는 반면, 자바는 가상 머신(VM)을 통해 해석 및 실행되므로 정수형 비트 수를 다르게 할 필요가 없다. 이는 C/C++에서 정수 실행이 기계어를 통해 ALU와 연관되어 실행되는 것과 대조적이다.
--
;자바 고유의 정수 비트 수
* byte : 8비트 정수형
* short : 16비트 정수형
* int : 32비트 정수형
* long : 64비트 정수형
C언어가 `int`를 CPU에 따라 16비트 또는 32비트로 사용하는 것과 달리, 자바는 32비트를 사용하므로 C언어보다 편리하다. 정수 부호 처리는 2의 보수를 사용하며, 이는 C언어와 동일하다.
자바에서 `char` 변수는 16비트 유니코드(UNICODE)를 처리하므로 C/C++의 `char`와 혼동해서는 안 된다.
| 비트 수 | 이름 | 범위 (부호 있는 숫자 표현에 2의 보수를 사용한다고 가정) | 용도 |
|---|---|---|---|
| 8 | byte | −128 ~ 127 | ASCII 문자, UTF-8의 코드 단위 |
| 16 | short | −32,768 ~ 32,767 | UCS-2 문자, UTF-16의 코드 단위 |
| 32 | int | −2,147,483,648 ~ 2,147,483,647 | UTF-32 문자, 알파 채널을 포함한 트루 컬러, FourCC, 32비트 컴퓨팅에서의 포인터 |
| 64 | long | −9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 시간 (예: 유닉스 에포크 이후의 밀리초), 64비트 컴퓨팅에서의 포인터 |
Java는 당초 유니코드 1.0을 도입하여 `char`형을 UCS-2를 표현하는 16비트 형으로 설계했다. 그러나 유니코드 2.0(1996년)에서 도입된 서로게이트 페어 때문에 1 문자에 `char` 2개를 소비하는 경우가 발생하게 되었다.
5.3. C#
C#은 `sbyte`, `byte`, `short`, `ushort`, `int`, `uint`, `long`, `ulong` 등 다양한 정수 자료형을 제공한다. 이 중 `sbyte`, `short`, `int`, `long`은 부호 있는 정수형을 나타내며, 음수와 양수 값을 모두 표현할 수 있다. 반면 `byte`, `ushort`, `uint`, `ulong`은 부호 없는 정수형으로, 0과 양수 값만 표현 가능하다.
| 비트 수 | 이름 | 범위 (부호 있는) | 범위 (부호 없는) | C# 자료형 |
|---|---|---|---|---|
| 8 | byte, octet | -128 ~ 127 | 0 ~ 255 | `sbyte` (부호 있는), `byte` (부호 없는) |
| 16 | halfword, word, short | -32,768 ~ 32,767 | 0 ~ 65,535 | `short` (부호 있는), `ushort` (부호 없는) |
| 32 | word, long, doubleword, longword, int | -2,147,483,648 ~ 2,147,483,647 | 0 ~ 4,294,967,295 | `int` (부호 있는), `uint` (부호 없는) |
| 64 | word, doubleword, longword, long long, quad, quadword, int64 | -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 | 0 ~ 18,446,744,073,709,551,615 | `long` (부호 있는), `ulong` (부호 없는) |
5.4. Python
파이썬은 `int` 자료형 하나만 제공하며, 이는 임의 정밀도 정수를 지원한다. Python 3부터는 정수형과 long 정수형이 통합되어, 매우 큰 숫자도 자유롭게 다룰 수 있다. 예를 들어 1킬로바이트의 메모리를 사용하면 최대 2466자리의 십진수를 저장할 수 있을 만큼 큰 수를 지원한다.
5.5. 기타 언어
자바스크립트는 Number 자료형을 통해 부동 소수점 수와 정수를 모두 처리한다. SQL에서는 `tinyint`, `smallint`, `int`, `bigint` 등 다양한 크기의 정수 자료형을 제공한다.
6. 한국의 IT 환경과 정수 자료형
과거 한국에서는 16비트 운영체제와 컴파일러를 사용하는 경우가 많아 `int` 자료형이 16비트로 처리되는 경우가 있었다. 이는 해외에서 개발된 프로그램과의 호환성 문제를 야기하기도 했다. 그러나 현재는 대부분의 시스템이 32비트 또는 64비트 환경으로 전환되었으며, `int` 자료형은 일반적으로 32비트로 처리된다.
유니코드의 도입과 함께, 한글을 포함한 다국어 문자를 처리하기 위해 16비트 이상의 정수 자료형(예: Java의 `char`)을 사용하는 경우가 많다. Java는 초기 유니코드 1.0을 도입하여 `char`형을 UCS-2를 표현하는 16비트 형으로 하였으나, 이후 유니코드 2.0에서 도입된 서로게이트 페어 때문에 1 문자에 `char` 2개를 소비하는 경우가 발생하게 되었다.
ASCII 문자 코드 체계에서는 7비트로 모든 문자를 표현할 수 있으므로 1 문자를 1 바이트의 정수형으로 취급하는 것이 가능하다. 그러나 한국어 등 문자 종류가 많은 언어에서는 1 문자를 1 바이트로 표현하는 것이 불가능하며, 1 문자를 여러 바이트로 나타내는 부호화 방식(멀티바이트 인코딩)이 고안되었다.
C 언어의 `char`형은 메모리 어드레싱의 최소 단위를 나타내는 형으로, `sizeof(char)`는 항상 1이다. C/C++의 와이드 문자형 `wchar_t`는 길이가 `char` 이상이어야 하며, 인코딩에 대한 규정은 없다.