directory search
Algorithms Algorithms(算法) bsearch bsearch_s qsort qsort_s Atomic operations Atomic operations library(原子操作库) ATOMIC_*_LOCK_FREE atomic_compare_exchange_strong atomic_compare_exchange_strong_explicit atomic_compare_exchange_weak atomic_compare_exchange_weak_explicit atomic_exchange atomic_exchange_explicit atomic_fetch_add atomic_fetch_add_explicit atomic_fetch_and atomic_fetch_and_explicit atomic_fetch_or atomic_fetch_or_explicit atomic_fetch_sub atomic_fetch_sub_explicit atomic_fetch_xor atomic_fetch_xor_explicit atomic_flag atomic_flag_clear atomic_flag_clear_explicit ATOMIC_FLAG_INIT atomic_flag_test_and_set atomic_flag_test_and_set_explicit atomic_init atomic_is_lock_free atomic_load atomic_load_explicit atomic_signal_fence atomic_store atomic_store_explicit atomic_thread_fence(线程围栏) ATOMIC_VAR_INIT kill_dependency memory_order(内存排序) C keywords auto(自动存储) break(跳出循环) C keywords(关键词) case char const(常量修饰符) continue default(预设运算式) do double(双精度浮点型) else enum(枚举类型) extern(全局变量) float(浮点数) for fortran goto(goto语句) if(if语句) inline(行内函式) int long(长整型) register(寄存器变量) restrict( restrict类型限定符) return short signed sizeof(sizeof运算符) static(静态变量) struct(结构体) switch(switch语句) typedef(typedef关键字) union(联合体) unsigned(无符号) void(空类型) volatile(volatile变量) while(while语句) _Alignas _Alignof _Atomic _Bool _Complex _Generic _Imaginary _Noreturn _Static_assert _Thread_local C language #define directive #elif directive #else directive #endif directive #error directive #if directive #ifdef directive #ifndef directive #include directive #line directive #pragma directive alignas(对齐指定符) Alternative operators and tokens(替代运算符和令牌) Analyzability Arithmetic operators Arithmetic types Array declaration(数组声明) Array initialization(阵列初始化) ASCII Chart Assignment operators(赋值运算符) types(atomic类型限定符) Basic concepts Bit fields(位域) break statement C language C Operator Precedence cast operator character constant(字符字面量) Comments(注释符) Comparison operators(比较运算符) compound literals(符合字面量) Conditional inclusion(条件包含) Conformance(一致性) const type qualifier(const 限定符) Constant expressions(常量表达) continue statement Declarations(声明) do-while loop Enumerations(枚举类型) Escape sequences(转义字符) Expressions(表达式) External and tentative definitions(外部和暂定的定义) File scope(文件范围) floating constant(浮点常量) for loop Function declarations(函数声明) Function definitions(函数声明) Functions Generic selection泛型选择 goto statement Identifier(标示符) if statement Implicit conversions(隐式转换) Increment/decrement operators(前置/后置操作符) Initialization(初始化) inline function specifier(内联函式) integer constant Lifetime(生命期) Logical operators(逻辑运算符) Lookup and name spaces Main function(主函式) Member access operators(会员接入运营商) Memory model Objects and alignment(字节对齐) Order of evaluation(评估顺序) Other operators Phases of translation(翻译阶段) Pointer declaration Preprocessor(预处理) restrict type qualifier(restrict类型限定符) return statement Scalar initialization(标量类型初始化) Scope(范围) sizeof operator(sizeof运算符) Statements(陈述) static assert declaration(静态断言声明) Static storage duration(静态存储周期) Storage-class specifiers(存储类说明符) string literals(字符串字面量) Struct and union initialization(结构体与联合体初始化) Struct declaration(结构体声明) switch statement Thread storage duration(线程存储时间) Type Type(类型) Typedef declaration(Typedef声明) Undefined behavior(未定义行为) Union declaration(联合体声明) Value categories(值类别) Variadic arguments(变长参数宏) volatile type qualifier(volatile 类型限定符) while loop _Alignof operator _Noreturn function specifier Date and time asctime(asctime函数) asctime_s clock CLOCKS_PER_SEC clock_t ctime(ctime函数) ctime_s Date and time utilities(日期和时间库) difftime(计算两个时间的间隔) gmtime gmtime_s localtime localtime_s mktime(将时间结构数据转换成经过的秒数的函数) strftime(格式化输出时间函数) time timespec timespec_get time_t tm wcsftime(格式化时间宽字符) Dynamic memory management aligned_alloc C memory management library(内存管理库) calloc free(释放动态分配空间的函数) malloc(动态分配内存空间的函数) realloc(重新分配内存空间的函数) Error handling abort_handler_s assert(断言) constraint_handler_t errno(错误报告) Error handling(错误处理) Error numbers(错误个数) ignore_handler_s set_constraint_handler_s static_assert File input/output clearerr(清除/复位) fclose feof ferror fflush(清空文件缓冲区) fgetc fgetpos fgets fgetwc fgetws File input/output fopen fopen_s fprintf fprintf_s fputc fputs fputwc fputws fread freopen freopen_s fscanf fscanf_s fseek fsetpos ftell fwide fwprintf fwprintf_s fwrite fwscanf fwscanf_s getc getchar gets gets_s getwchar perror printf printf_s putc putchar puts putwc putwchar remove rename rewind scanf scanf_s setbuf setvbuf snprintf sprintf sscanf sscanf_s swprintf swprintf_s swscanf swscanf_s tmpfile tmpfile_s tmpnam tmpnam_s ungetc ungetwc vfprintf vfprintf_s vfscanf vfscanf_s vfwprintf vfwprintf_s vfwscanf vfwscanf_s vprintf vprintf_s vscanf vscanf_s vsnprintf vsprintf vsscanf vsscanf_s vswprintf vswprintf_s vswscanf vswscanf_s vwprintf vwprintf_s vwscanf vwscanf_s wprintf wprintf_s wscanf wscanf_s Localization support lconv LC_ALL LC_COLLATE LC_CTYPE LC_MONETARY LC_NUMERIC LC_TIME localeconv Localization support setlocale Numerics abs acos acosf acosh acoshf acoshl acosl asin asinf asinh asinhf asinhl asinl atan atan2 atan2f atan2l atanf atanh atanhf atanhl atanl cabs cabsf cabsl cacos cacosf cacosh cacoshf cacoshl cacosl carg cargf cargl casin casinf casinh casinhf casinhl casinl catan catanf catanh catanhf catanhl catanl cbrt cbrtf cbrtl ccos ccosf ccosh ccoshf ccoshl ccosl ceil ceilf ceill cexp cexpf cexpl cimag cimagf cimagl clog clogf clogl CMPLX CMPLXF CMPLXL Common mathematical functions complex Complex number arithmetic conj conjf conjl copysign copysignf copysignl cos cosf cosh coshf coshl cosl cpow cpowf cpowl cproj cprojf cprojl creal crealf creall csin csinf csinh csinhf csinhl csinl csqrt csqrtf csqrtl ctan ctanf ctanh ctanhf ctanhl ctanl div double_t erf erfc erfcf erfcl erff erfl exp exp2 exp2f exp2l expf expl expm1 expm1f expm1l fabs fabsf fabsl fdim feclearexcept fegetenv fegetexceptflag fegetround feholdexcept feraiseexcept fesetenv fesetexceptflag fesetround fetestexcept feupdateenv FE_ALL_EXCEPT FE_DFL_ENV FE_DIVBYZERO FE_DOWNWARD FE_INEXACT FE_INVALID FE_OVERFLOW FE_TONEAREST FE_TOWARDZERO FE_UNDERFLOW FE_UPWARD Floating-point environment float_t floor floorf floorl fma fmaf fmal fmax fmaxf fmaxl fmin fminf fminl fmod fmodf fmodl fpclassify FP_INFINITE FP_NAN FP_NORMAL FP_SUBNORMAL FP_ZERO frexp frexpf frexpl HUGE_VAL HUGE_VALF HUGE_VALL hypot hypotf hypotl I ilogb ilogbf ilogbl imaginary imaxabs imaxdiv INFINITY isfinite isgreater isgreaterequal isinf isless islessequal islessgreater isnan isnormal isunordered labs ldexp ldexpf ldexpl ldiv lgamma lgammaf lgammal llabs lldiv llrint llrintf llrintl llround llroundf llroundl log log10 log10f log10l log1p log1pf log1pl log2 log2f log2l logb logbf logbl logf logl lrint lrintf lrintl lround lroundf lroundl MATH_ERREXCEPT math_errhandling MATH_ERRNO modf modff modfl nan NAN nanf nanl nearbyint nearbyintf nearbyintl nextafter nextafterf nextafterl nexttoward nexttowardf nexttowardl Numerics pow powf powl Pseudo-random number generation rand RAND_MAX remainder remainderf remainderl remquo remquof remquol rint rintf rintl round roundf roundl scalbln scalblnf scalblnl scalbn scalbnf scalbnl signbit sin sinf sinh sinhf sinhl sinl sqrt sqrtf sqrtl srand tan tanf tanh tanhf tanhl tanl tgamma tgammaf tgammal trunc truncf truncl Type-generic math _Complex_I _Imaginary_I Program support abort atexit at_quick_exit exit EXIT_FAILURE EXIT_SUCCESS getenv getenv_s jmp_buf longjmp Program support utilities quick_exit raise setjmp SIGABRT SIGFPE SIGILL SIGINT signal SIGSEGV SIGTERM sig_atomic_t SIG_DFL SIG_ERR SIG_IGN system _Exit Strings atof atoi atol atoll btowc c16rtomb c32rtomb char16_t char32_t isalnum isalpha isblank iscntrl isdigit isgraph islower isprint ispunct isspace isupper iswalnum iswalpha iswblank iswcntrl iswctype iswdigit iswgraph iswlower iswprint iswpunct iswspace iswupper iswxdigit isxdigit mblen mbrlen mbrtoc16 mbrtoc32 mbrtowc mbsinit mbsrtowcs mbsrtowcs_s mbstate_t mbstowcs mbstowcs_s mbtowc memchr memcmp memcpy memcpy_s memmove memmove_s memset memset_s Null-terminated byte strings Null-terminated multibyte strings Null-terminated wide strings strcat strcat_s strchr strcmp strcoll strcpy strcpy_s strcspn strerror strerrorlen_s strerror_s Strings library strlen strncat Thread support call_once cnd_broadcast cnd_destroy cnd_init cnd_signal cnd_timedwait cnd_wait mtx_destroy mtx_init mtx_lock mtx_plain mtx_recursive mtx_timed mtx_timedlock mtx_trylock mtx_unlock once_flag ONCE_FLAG_INIT thrd_busy thrd_create thrd_current thrd_detach thrd_equal thrd_error thrd_exit thrd_join thrd_nomem thrd_sleep thrd_success thrd_timedout thrd_yield Thread support library thread_local tss_create tss_delete TSS_DTOR_ITERATIONS tss_get tss_set Type support Boolean type support library Fixed width integer types FLT_EVAL_METHOD FLT_ROUNDS max_align_t NULL Numeric limits offsetof ptrdiff_t size_t Type support Variadic functions Variadic functions va_arg va_copy va_end va_list va_start
characters

(另请参阅类型系统概述的类型以及由C库提供的与类型相关的实用程序的列表)。

  • _Bool (也可以作为宏布尔) - 类型,能够保存两个值之一:1和0(也可以通过宏来访问true和false)。

请注意,conversion to _Bool与转换为其他整数类型的转换不同:(bool)0.5评估为1,而(int)0.5评估为0

(since C99)

字符类型

  • signed char  - 输入有符号字符表示。

  • unsigned char - 输入无符号字符表示。还用于检查对象表示(原始内存)。

  • char - 字符表示的类型。等同于signed char或者unsigned char(哪一个是实现定义的,并且可以由编译器命令行开关控制),但是char是不同的类型,不同于signed char两者unsigned char

请注意,标准库还定义了用于表示宽字符的typedef名称wchar_t,char16_t和char32_t(自C11起)。

整数类型

  • short int(也可以访问short,可以使用关键字signed

  • unsigned short int(也可以访问unsigned short

  • int(也可以访问signed int

  • unsigned int(也可以访问unsignedint,实现模运算的未签名对应方。适用于位操作。

  • long int(也可以访问long

  • unsigned long int(也可以访问unsigned long

这是该平台的最佳整数类型,并且保证至少为16位。大多数当前系统使用32位(请参见下面的数据模型)。

  • long long int(也可以访问long long

  • unsigned long long int(也可以访问unsigned long long

(since C99)

注意:与所有类型说明符一样,任何次序都是允许的:unsigned long long intlong int unsigned long命名相同的类型。

下表总结了所有可用的整数类型及其属性:

类型说明符

等效类型

数据模型的位宽





C标准

LP32

ILP32

LLP64

LP64



短整型

至少为16

16

16

16

16

除了最小的位数外,C标准保证了:   1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

注意:这允许在极端情况下字节大小为64位,所有类型(包括char)都是64位宽,并且sizeof对于每种类型返回1。

注意:对于有符号和无符号整数类型,整数算术的定义是不同的。请参阅算术运算符,特别是整数溢出。

数据模型

每种实现对基本类型大小的选择统称为数据模型。四个数据模型被广泛接受:

32位系统:

  • LP322/4/4(int是16位长,指针是32位)

    • Win16 API

  • ILP324/4/4(int,long和指针是32位);

    • Win32 API

    • Unix和类Unix系统(Linux,Mac OS X)

64位系统:

  • LLP644/4/8(int和long是32位,指针是64位)

    • Win64 API

  • LP644/8/8(int是32位长,指针是64位)

    • Unix和类Unix系统(Linux,Mac OS X)

其他型号非常少见。例如,ILP648/8/8:int,long和指针是64位)仅出现在一些早期的64位Unix系统中(例如Cray上的Unicos)。

请注意,自C99开始,精确宽度的整数类型在<stdint.h>中可用。

真正的浮动类型

C有三种类型来表示实际的浮点值:

  • float - 单精度浮点型。如果支持,匹配IEEE-754 32位浮点类型。

  • double - 双精度浮点型。如果支持,匹配IEEE-754 64位浮点类型

  • long double - 扩展精度浮点类型。如果支持,则匹配IEEE-754扩展浮点类型,否则匹配某些非标准扩展浮点类型,只要其精度优于double且范围至少与double一致,否则匹配类型double。一些x86和x86_64实现使用80位x87浮点类型。

浮点类型可能支持特殊值:

  • 无限(正面和负面),见INFINITY

  • 负零-0.0。它类似于正零,但在一些算术运算中有意义,例如1.0/0.0 == INFINITY而非1.0/-0.0 == -INFINITY

  • 非数字(NaN),它与任何其他内容(包括它本身)都不相等。多位模式表示NaN的,参阅nanNAN。请注意,C没有特别注意发送NaN(由IEEE-754指定),并将所有NaN视为静态。

实数浮点数可能与算术运算符+  -  / *和math.h中的各种数学函数一起使用。内置运算符和库函数都可能会引发浮点异常且errno按照math_errhandling中所述进行设置。

请参阅,浮点表达式的范围和精度可能比其类型所指示的范围和精度要高于FLT_EVAL_METHOD。赋值,返回和强制将范围和精度强制为与声明类型关联的范围和精度。

浮点表达式也可能会收缩,就像所有中间值具有无限范围和精度一样计算,请参阅#pragma STDC FP_CONTRACT。

浮点数的一些操作受浮点环境的状态(最显着的是舍入方向)的影响和修改。

隐式转换定义在实际浮点类型与整数,复数和虚数类型之间。

有关浮点类型的其他详细信息,限制和属性,请参阅浮点类型的限制和math.h库。

复杂的浮动类型

复数浮点类型对数学复数进行建模,即可以写成实数和实数乘以虚数单位的和的数字:a + bi

三种复杂类型是

  • float _Complex(也可以像float complex包含<complex.h>一样使用)

  • double _Complex(也可以像double complex包含<complex.h>一样使用)

  • long double _Complex(也可以像long double complex包含<complex.h>一样使用)

注意:与所有类型说明符一样,可以使用任何顺序: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__(C11)由实现定义,<complex.h>则不提供复杂类型(以及库标题)。(自C11以来)

每个复杂类型具有相同的对象表示和对准要求作为一个阵列对应的真实类型的两个元件(的浮动为float compelx,double为double complex,long 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.0imemcpy(&z2, a+2, sizeof z2); // z2 becomes 3.0 + 4.0i

复数可能与算术运算符+  - 和*一起使用,可能与虚数和实数混合使用。在complex.h中为复数定义了许多数学函数。内置运算符和库函数都可能会引发浮点异常并errno按照math_errhandling中所述进行设置。

没有为复杂类型定义增量和减量。

没有为复杂类型定义关系运算符(没有“小于”的概念)在复杂类型和其他算术类型之间定义隐式转换。

为了支持复数运算的单一无穷大模型,C 将具有至少一个无限部分的任何复数值视为无穷大,即使其另一部分是 NaN,也保证所有运算符和函数都遵守入口的基本属性并提供cproj将所有无穷大映射到规范的一个(请参阅算术运算符以了解确切的规则)。

运行此代码

#include <stdio.h>#include <complex.h>#include <math.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 + i*%f\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 + i*%f\n", creal(y), cimag(y));

可能的输出:

inf + i*inf 
inf + i*nan

C 尽管存在笛卡尔表示的内在局限性,但它也可以处理多个无穷大,以尽可能地保留方向信息:

将虚数单位乘以实无穷大给出正确签名的虚无限:i×∞=i∞。另外,i×(∞-i∞)=∞+i∞表示合理的象限。

虚浮点类型

虚浮点类型对数学虚数进行建模,即可以写成实数乘以虚数单位的数字:bi 三个虚构类型。

  • float _Imaginary(也可以像float imaginary包含<complex.h>一样使用)

  • double _Imaginary(也可以像double imaginary包含<complex.h>一样使用)

  • long double _Imaginary(也可以像long double imaginary包含<complex.h>一样使用)

注意:与所有类型说明符一样,可以使用任何顺序: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是否被定义为标识虚数支持。(自C99开始)(直到C11)

如果__STDC_IEC_559_COMPLEX__定义了虚数,则支持虚数。(自 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)必须使用 NaN 。具有负零虚数分量的数字也是如此,当使用分支切分处理库函数时这些数字是有意义的,例如csqrt1.0 - 0.0*I如果I定义为正零零虚数分量,_Complex_I并且负零虚数部分需要使用CMPLXconj

虚构类型也简化了实现; 如果虚数类型得到支持,则可以用两次乘法直接实现虚数与复数的乘法,而不是四次乘法和两次加法。

(since C99)

关键词

char, int, short, long, signed, unsigned, float, double. _Bool, _Complex, _Imaginary.

值的范围

下表提供了常用数字表示限制的参考。由于 C 标准允许任何带符号的整数表示,因此该表给出了最小保证需求(对应于补码的限制或符号和幅度)以及最常用的实现的限制,即二进制补码。不过,所有流行的数据模型(包括 ILP32,LP32,LP64,LLP64)都使用二进制补码表示法。

类型

大小以位为单位

格式

值范围


近似

精确值




字符

8

signed (补充)

-127至127


signed (二补)

-128至127




无符号

0到255




积分

16

signed (补充)

± 3.27 · 104

-32767至32767

signed (二补)

-32768至32767




无符号

0至6.55·104

0至65535



32

signed (补充)

± 2.14 · 109

-2,147,483,647至2,147,483,647


signed (二补)

-2,147,483,648至2,147,483,647




无符号

0至4.29·109

0至4,294,967,295



64

signed (补充)

± 9.22 · 1018

-9,223,372,036,854,775,807至9,223,372,036,854,775,807


signed (二补)

-9,223,372,036,854,775,808至9,223,372,036,854,775,807




unsigned

0到1.84·1019

0至18,446,744,073,709,551,615



浮点

32

IEEE-754

±3.4·10±38(〜7位)

min低于正常值:±1.401,298,4·10-47分钟正常值:±1.175,494.3·10-38最高值:±3.402,823,4.1038

64

IEEE-754

±1.7·10±308(〜15位)

min低于正常值:±4.940,656,458,412·10-324分钟正常值:±2.225,073,858,507,201,4·10-308最大值:±1.797,693,134,862,315,7·10308


  • 次正常:±1,401,298.4·10-47

  • 分钟正常值:±1.175,494.3·10-38

  • 最大值:±3.402,823,4.1038

 64   IEEE-754   **± 1.7 · 10± 308**

(~15 digits)

  • 次正常分:±4,940,656,458,412·10-324

  • 分钟正常值:±2.225,073,858,507,201,4·10-308

  • 最大:±1.797,693,134,862,315,7·10308

注意:库头文件<limits.h>和<float.h>中提供了实际的(而不是保证的最小值)范围

Previous article: Next article: