名稱空間
變體
操作

算術型別

來自 cppreference.com
< c‎ | language

(另請參見型別獲取型別系統概述,以及C標準庫提供的與型別相關的實用程式列表。)

目錄

布林型別

  • _Bool(也可透過宏bool訪問)(直至 C23)bool(自 C23 起) — 一種型別,能夠持有以下兩個值之一:10(也可透過宏truefalse訪問)(直至 C23)truefalse(自 C23 起)

請注意,轉換_Bool(直至 C23)bool(自 C23 起)與轉換為其他整數型別的方式不同:(bool)0.5求值為true,而(int)0.5求值為0

(C99 起)

[編輯] 字元型別

  • signed char — 用於有符號字元表示的型別。
  • unsigned char — 用於無符號字元表示的型別。也用於檢查物件表示(原始記憶體)。
  • char — 用於字元表示的型別。等同於signed charunsigned char(具體是哪一個由實現定義,並可能由編譯器命令列開關控制),但char是一個不同的型別,與signed charunsigned char都不同。

請注意,標準庫還定義了typedef名稱wchar_tchar16_tchar32_t(自 C11 起)來表示寬字元以及char8_t表示UTF-8字元(自 C23 起)

[編輯] 整數型別

  • short int (也可訪問為short, 可使用關鍵詞signed)
  • unsigned short int (也可訪問為unsigned short)
  • int (也可訪問為signed int)
這是平臺上最優的整數型別,並保證至少為16位。大多數當前系統使用32位(見下文資料模型)。
  • unsigned int (也可訪問為unsigned),是int的無符號對應型別,實現模算術。適用於位操作。
  • long int (也可訪問為long)
  • unsigned long int (也可訪問為unsigned long)
  • long long int (也可訪問為long long)
  • unsigned long long int (也可訪問為unsigned long long)
(C99 起)
  • _BitInt(n)(也可訪問為signed _BitInt(n)),位精確有符號整數型別(其中`n`被替換為一個整數常量表達式,表示精確寬度(包括符號位),不能大於<limits.h>中的BITINT_MAXWIDTH
  • unsigned _BitInt(n),位精確無符號整數型別(其中`n`被替換為一個整數常量表達式,表示精確寬度,不能大於<limits.h>中的BITINT_MAXWIDTH
(自 C23 起)

注意:與所有型別說明符一樣,任何順序都是允許的:unsigned long long intlong int unsigned long指代相同的型別。

下表總結了所有可用的整數型別及其屬性

型別說明符 等效型別 資料模型下的位寬
C 標準 LP32 ILP32 LLP64 LP64
char
char 至少
8
8 8 8 8
signed char
signed char
unsigned char
unsigned char
short
short int 至少
16
16 16 16 16
short int
signed short
signed short int
unsigned short
unsigned short int
unsigned short int
int
int 至少
16
16 32 32 32
signed
signed int
unsigned
unsigned int
unsigned int
long
long int 至少
32
32 32 32 64
long int
signed long
signed long int
unsigned long
unsigned long int
unsigned long int
long long
long long int
(C99)
至少
64
64 64 64 64
long long int
signed long long
signed long long int
unsigned long long
unsigned long long int
(C99)
unsigned long long int

除了最小位數外,C 標準還保證

1 == sizeof(char) sizeof(short) sizeof(int) sizeof(long) sizeof(long long)

注意:這允許極端情況,即位元組大小為64位,所有型別(包括char)都為64位寬,且sizeof對每種型別都返回1

注意:有符號和無符號整數型別的整數算術定義不同。請參閱算術運算子,特別是整數溢位

[編輯] 資料模型

每個實現對基本型別大小的選擇統稱為“資料模型”。四種資料模型獲得廣泛接受

32位系統

  • LP322/4/4 (int 為 16 位,long 和指標為 32 位)
  • Win16 API
  • ILP324/4/4 (intlong 和指標為 32 位);
  • Win32 API
  • Unix 和類 Unix 系統 (Linux, Mac OS X)

64 位系統

  • LLP644/4/8 (intlong 為 32 位,指標為 64 位)
  • Win64 API
  • LP644/8/8 (int 為 32 位,long 和指標為 64 位)
  • Unix 和類 Unix 系統 (Linux, Mac OS X)

其他模型非常罕見。例如,ILP648/8/8intlong和指標均為64位)僅出現在一些早期64位Unix系統(例如Cray上的Unicos)中。

請注意,自 C99 起,<stdint.h> 中提供了精確寬度的整數型別。

[編輯] 實浮點型別

C有三個或六個(自 C23 起)型別用於表示實浮點值

  • float — 單精度浮點型別。如果支援,匹配IEEE-754 binary32 格式
  • double — 雙精度浮點型別。如果支援,匹配IEEE-754 binary64 格式
  • long double — 擴充套件精度浮點型別。如果支援,匹配IEEE-754 binary128 格式;否則,如果支援,匹配IEEE-754 binary64 擴充套件格式;否則,匹配某些非IEEE-754 擴充套件浮點格式,只要其精度優於binary64且範圍至少與binary64相同;否則,匹配IEEE-754 binary64 格式。
    • 某些HP-UX、SPARC、MIPS、ARM64和z/OS實現使用binary128格式。
    • 最著名的IEEE-754 binary64擴充套件格式是80位x87擴充套件精度格式。它被許多x86和x86-64實現使用(一個顯著的例外是MSVC,它以與double相同的格式(即binary64)實現long double)。
如果實現預定義了宏常量 __STDC_IEC_60559_DFP__,則還支援以下十進位制浮點型別。
否則,不支援這些十進位制浮點型別。
(自 C23 起)

浮點型別可能支援特殊值

  • 無窮大(正和負),參見INFINITY
  • 負零-0.0。它與正零比較相等,但在某些算術運算中具有意義,例如1.0 / 0.0 == INFINITY,但1.0 / -0.0 == -INFINITY
  • 非數值 (NaN),它不與任何值(包括自身)比較相等。多個位模式表示NaN,參見nanNAN。請注意,C不特別關注信令NaN(由IEEE-754指定),並將所有NaN視為安靜NaN。

實浮點數可與算術運算子+ - / *以及<math.h>中的各種數學函式一起使用。內建運算子和庫函式都可能引發浮點異常並設定errno,如math_errhandling所述。

浮點表示式可能具有比其型別指示的更大的範圍和精度,請參見FLT_EVAL_METHOD賦值返回強制轉換會強制範圍和精度與宣告的型別關聯。

浮點表示式也可以被“收縮”(contracted),即,計算時假設所有中間值都具有無限範圍和精度,參見#pragma STDC FP_CONTRACT

對浮點數的一些操作會受浮點環境狀態的影響並修改其狀態(最顯著的是舍入方向)。

實浮點型別與整數、複數和虛數型別之間定義了隱式轉換

有關浮點型別的更多詳細資訊、限制和屬性,請參閱浮點型別的限制<math.h>庫。

復浮點型別

復浮點型別模擬數學上的複數,即可以寫成實數和乘以虛數單位的實數之和的數:a + bi

這三種複數型別是

注意:與所有型別說明符一樣,任何順序都是允許的:long double complexcomplex long double,甚至double complex long都指代相同的型別。

#include <complex.h>
#include <stdio.h>
 
int main(void)
{
    double complex z = 1 + 2*I;
    z = 1 / z;
    printf("1/(1.0+2.0i) = %.1f%+.1fi\n", creal(z), cimag(z));
}

輸出

1/(1.0+2.0i) = 0.2-0.4i

如果實現定義了宏常量 __STDC_NO_COMPLEX__,則不提供複數型別(以及庫標頭檔案 <complex.h>)。

(C11 起)

每個複數型別都具有與其對應的實數型別(float 對應於 float complexdouble 對應於 double complexlong double 對應於 long double complex)的兩個元素陣列相同的物件表示對齊要求。陣列的第一個元素包含實部,第二個元素包含虛部。

float a[4] = {1, 2, 3, 4};
float complex z1, z2;
memcpy(&z1, a, sizeof z1); // z1 becomes 1.0 + 2.0i
memcpy(&z2, a+2, sizeof z2); // z2 becomes 3.0 + 4.0i

複數可與算術運算子 + - */ 一起使用,並可與虛數和實數混合使用。<complex.h> 中定義了許多複數的數學函式。內建運算子和庫函式都可能引發浮點異常並設定 errno,如 math_errhandling 中所述。

增量和減量未定義用於複數型別。

關係運算符未定義用於複數型別(沒有“小於”的概念)。

複數型別與其他算術型別之間定義了隱式轉換

為了支援複數算術的單無窮大模型,C 將任何至少含有一個無窮大部分的複數視為無窮大,即使其另一部分是 NaN;它保證所有運算子和函式都遵守無窮大的基本屬性,並提供cproj 將所有無窮大對映到規範的無窮大(有關精確規則,請參閱算術運算子)。

#include <complex.h>
#include <math.h>
#include <stdio.h>
 
int main(void)
{
    double complex z = (1 + 0*I) * (INFINITY + I*INFINITY);
//  textbook formula would give
//  (1+i0)(∞+i∞) ⇒ (1×∞ – 0×∞) + i(0×∞+1×∞) ⇒ NaN + I*NaN
//  but C gives a complex infinity
    printf("%f%+f*i\n", creal(z), cimag(z));
 
//  textbook formula would give
//  cexp(∞+iNaN) ⇒ exp(∞)×(cis(NaN)) ⇒ NaN + I*NaN
//  but C gives  ±∞+i*nan
    double complex y = cexp(INFINITY + I*NAN);
    printf("%f%+f*i\n", creal(y), cimag(y));
}

可能的輸出

inf+inf*i 
inf+nan*i

C 還處理多個無窮大,以便在可能的情況下保留方向資訊,儘管笛卡爾表示法固有侷限性

將虛數單位乘以實無窮大得到正確符號的虛無窮大:i × ∞ = i∞。另外,i × (∞ – i∞) = ∞ + i∞ 指示合理的象限。

虛浮點型別

虛浮點型別模擬數學上的虛數,即可以寫成實數乘以虛數單位的數:bi這三種虛數型別是

注意:與所有型別說明符一樣,任何順序都是允許的:long double imaginaryimaginary long double,甚至double imaginary long都指代相同的型別。

#include <complex.h>
#include <stdio.h>
 
int main(void)
{
    double imaginary z = 3*I;
    z = 1 / z;
    printf("1/(3.0i) = %+.1fi\n", cimag(z));
}

輸出

1/(3.0i) = -0.3i

定義了 __STDC_IEC_559_COMPLEX__ 的實現建議(但並非強制要求)支援虛數。POSIX 建議檢查宏 _Imaginary_I 是否定義以識別虛數支援。

(C11 之前)

如果定義了__STDC_IEC_559_COMPLEX__(直至 C23)__STDC_IEC_60559_COMPLEX__(自 C23 起),則支援虛數。

(C11 起)

這三種虛數型別中的每一種都具有與其對應的實數型別float 對應 float imaginarydouble 對應 double imaginarylong double 對應 long double imaginary)相同的物件表示對齊要求

注意:儘管如此,虛數型別是不同的,並且與其對應的實數型別不相容,這禁止了別名。

虛數可與算術運算子 + - */ 一起使用,並可與複數和實數混合使用。<complex.h> 中定義了許多虛數的數學函式。內建運算子和庫函式都可能引發浮點異常並設定 errno,如 math_errhandling 中所述。

增量和減量未定義用於虛數型別。

虛數型別與其他算術型別之間定義了隱式轉換

虛數使得使用自然表示法x + I*y(其中I定義為_Imaginary_I)來表示所有複數成為可能。如果沒有虛數型別,某些特殊的複數值就無法自然地建立。例如,如果I定義為_Complex_I,那麼編寫0.0 + I*INFINITY會導致實部為NaN,而必須使用CMPLX(0.0, INFINITY)。對於具有負零虛部的數字也是如此,這在使用帶分支切割的庫函式(例如csqrt)時是有意義的:如果I定義為_Complex_I,則1.0 - 0.0*I會產生正零虛部,而負零虛部需要使用CMPLXconj

虛數型別還簡化了實現;如果支援虛數型別,虛數與複數的乘法可以直觀地透過兩次乘法實現,而不是四次乘法和兩次加法。

(C99 起)

[編輯] 關鍵詞

[編輯] 值範圍

下表提供了常見數值表示的限制參考。

在C23之前,C標準允許任何有符號整數表示,並且N位有符號整數的最小保證範圍是從-(2N-1
-1)
+2N-1
-1
(例如,8位有符號型別為-127127),這對應於反碼符號和幅度的限制。

然而,所有流行的資料模型(包括所有ILP32、LP32、LP64、LLP64)和幾乎所有C編譯器都使用二進位制補碼表示(唯一已知的例外是一些UNISYS編譯器),並且自C23起,它是標準允許的唯一表示,保證範圍從-2N-1
+2N-1
-1
(例如,8位有符號型別為-128127)。

型別 位大小 格式 值範圍
大約 精確
字元 8 signed −128127
unsigned 0255
16 UTF-16 065535
32 UTF-32 01114111 (0x10ffff)
整數 16 signed ± 3.27 · 104 −3276832767
unsigned 06.55 · 104 065535
32 signed ± 2.14 · 109 −2,147,483,6482,147,483,647
unsigned 04.29 · 109 04,294,967,295
64 signed ± 9.22 · 1018 −9,223,372,036,854,775,8089,223,372,036,854,775,807
unsigned 01.84 · 1019 018,446,744,073,709,551,615
二進位制
浮點
型別
32 IEEE-754
  • 最小非規範數
    ± 1.401,298,4 · 10−45
  • 最小規範數
    ± 1.175,494,3 · 10−38
  • 最大
    ± 3.402,823,4 · 1038
  • 最小非規範數
    ±0x1p−149
  • 最小規範數
    ±0x1p−126
  • 最大
    ±0x1.fffffep+127
64 IEEE-754
  • 最小非規範數
    ± 4.940,656,458,412 · 10−324
  • 最小規範數
    ± 2.225,073,858,507,201,4 · 10−308
  • 最大
    ± 1.797,693,134,862,315,7 · 10308
  • 最小非規範數
    ±0x1p−1074
  • 最小規範數
    ±0x1p−1022
  • 最大
    ±0x1.fffffffffffffp+1023
80[注 1] x86
  • 最小非規範數
    ± 3.645,199,531,882,474,602,528
     · 10−4951
  • 最小規範數
    ± 3.362,103,143,112,093,506,263
     · 10−4932
  • 最大
    ± 1.189,731,495,357,231,765,021
     · 104932
  • 最小非規範數
    ±0x1p−16445
  • 最小規範數
    ±0x1p−16382
  • 最大
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • 最小非規範數
    ± 6.475,175,119,438,025,110,924,
    438,958,227,646,552,5 · 10−4966
  • 最小規範數
    ± 3.362,103,143,112,093,506,262,
    677,817,321,752,602,6 · 10−4932
  • 最大
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 104932
  • 最小非規範數
    ±0x1p−16494
  • 最小規範數
    ±0x1p−16382
  • 最大
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
十進位制
浮點
型別
32 IEEE-754
  • 最小非規範數
    ± 1 · 10-101
  • 最小規範數
    ± 1 · 10-95
  • 最大
    ± 9.999'999 · 1096
64 IEEE-754
  • 最小非規範數
    ± 1 · 10-398
  • 最小規範數
    ± 1 · 10-383
  • 最大
    ± 9.999'999'999'999'999 · 10384
128 IEEE-754
  • 最小非規範數
    ± 1 · 10-6176
  • 最小規範數
    ± 1 · 10-6143
  • 最大
    ± 9.999'999'999'999'999'999'
    999'999'999'999'999 · 106144
  1. 物件表示通常在32/64位平臺上分別佔用96/128位。

注意:實際(而非保證最小)範圍可在庫標頭檔案<limits.h><float.h>中獲得。

[編輯] 參見

C++ 文件,關於基本型別