文章目录

  • 一、数据类型
    • 1.1 通用
    • 1.2 Windows
      • 1.21 WinDef.h –> minwindef.h / winnt.h
      • 1.22 BaseTsd.h
      • 1.23 winerror.h
    • 1.3 Unix / Linux
  • 二、转义与格式控制
    • 2.1 转义
    • 2.2 格式控制
  • 三、ASCII 码

一、数据类型

1.1 通用

只列出简单数据类型。

C 语言中的基本数据类型包括以下几种:

  1. 整数类型

    • int:用于表示整数,通常为机器字长大小(通常是 4 字节或 8 字节)。
    • char:用于表示字符,通常为 1 字节。
    • short:用于表示短整数,通常为 2 字节。
    • long:用于表示长整数,通常为 4 字节或 8 字节,取决于编译器和平台。
    • long long:用于表示长长整数,通常为 8 字节。
  2. 无符号整数类型

    • unsigned int:用于表示无符号整数,通常为机器字长大小。
    • unsigned char:用于表示无符号字符,通常为 1 字节。
    • unsigned short:用于表示无符号短整数,通常为 2 字节。
    • unsigned long:用于表示无符号长整数,通常为 4 字节或 8 字节,取决于编译器和平台。
    • unsigned long long:用于表示无符号长长整数,通常为 8 字节。
  3. 浮点数类型

    • float:用于表示单精度浮点数,通常为 4 字节。
    • double:用于表示双精度浮点数,通常为 8 字节。
    • long double:用于表示扩展精度浮点数,其大小取决于编译器和平台。
  4. 布尔类型

    • _Bool:用于表示布尔值,只有两个可能的值,0 表示假(false),非零值表示真(true)。

下面是Windows下,mscv变量大小(复数是gcc):

数据类型大小(字节)说明所在头文件
int4整数数据类型
char1字符数据类型
float4单精度浮点数
double8双精度浮点数
short2短整数
long (long int)4长整数
unsigned int4无符号整数
unsigned char1无符号字符
unsigned short2无符号短整数
unsigned long4无符号长整数
long long8长长整数
unsigned long long8无符号长长整数
bool1布尔类型
size_t8用于表示对象大小的无符号整数类型
ptrdiff_t8用于表示指针之间差值的整数类型
intptr_t8用于表示指针值的整数类型
float complex8单精度复数
double complex16双精度复数


解释:

机器字长(Machine Word Length),也称为字大小或字宽,是计算机体系结构中的一个重要概念,它表示一次性处理的二进制数据块的位数。字长通常决定了计算机的寄存器大小、内存地址空间的大小以及其能够处理的整数或浮点数的大小。

以下是一些常见的机器字长值:

  1. 32 位机器:机器字长为 32 位,意味着它可以一次性处理 32 位(4 字节)的二进制数据。这种机器通常有 32 位的寄存器和 32 位的内存地址空间。例如,许多早期的个人计算机和服务器采用了 32 位体系结构。

  2. 64 位机器:机器字长为 64 位,它可以一次性处理 64 位(8 字节)的二进制数据。这种机器具有更大的内存地址空间和寄存器,可以处理更大范围的整数和浮点数数据。大多数现代个人计算机和服务器采用了 64
    位体系结构。


编译器问题:

同一个头文件、变量类型,不同的编译器的支持是不同的。比如微软的msvc,你直接使用里面的complex是会报错的,微软给了新的名称,比如:

typedef _C_double_complex_Dcomplex;typedef _C_float_complex _Fcomplex;typedef _C_ldouble_complex _Lcomplex;

还有很多类似的,有的可以关闭SDL检查避免报错。比如printf这些函数。

如果你想要进行跨平台开发,可以使用gcc 编译(比如通过MinGW等安装);如果进行Windows系统下的开发,用默认的msvc更好。


符号位:

C语言中有符号(signed)和无符号(unsigned)是用于描述整数数据类型的两种重要属性,它们之间的主要区别在于数据的表示范围和如何解释数据的位模式。

以下是有符号和无符号的区别:

  1. 数据范围

    • 有符号有符号整数可以表示正数、负数和零。有符号整数的范围由其位数决定,例如,一个8位有符号整数可以表示-128到127之间的值(包括这两个端点)。
    • 无符号:无符号整数只能表示非负数和零。无符号整数的范围从0到2^n-1,其中n是整数的位数。例如,一个8位无符号整数可以表示0到255之间的值。
  2. 位模式解释

    • 有符号有符号整数的位模式通常采用二进制补码表示法。这意味着最高位(最左侧的位)用于表示符号(0表示正数,1表示负数)(前面的-128到127),其余位用于表示数值。这种表示方式允许在数值上进行正负号切换,但可能导致溢出问题。
    • 无符号:无符号整数的位模式被解释为非负数,不涉及符号位。所有位都用于表示数值。这种表示方式不会有溢出问题,但不能表示负数。
  3. 溢出行为

    • 有符号:有符号整数在发生溢出时的行为是未定义的(undefined behavior)。这意味着当有符号整数的结果超出其表示范围时,程序可能会产生不确定的结果。
    • 无符号:无符号整数在发生溢出时会进行模运算。这意味着当无符号整数的结果超出其表示范围时,它将”循环”回到该范围内,产生一个模运算结果。

同一类型,有无符号,表示的数据个数是相同的。只是正负分布不同。


变量大小、最大最小值:

一般只有指针类型和long会随着编译器CPU架构变化。

不确定时,可以用sizeof()打印,结果是size_t类型。

当你知道变量大小时,其实就知道它的表示范围了,但这通常是一个比较大的数字,不方便书写。可以使用标准C库中的限界宏(Limit Macros),这些宏定义在头文件中。这些宏提供了每种整数数据类型的最小值和最大值。

部分:

宏名描述最小值最大值
CHAR_BITchar 的位数8
SCHAR_MINsigned char 的最小值-128127
SCHAR_MAXsigned char 的最大值-128127
UCHAR_MAXunsigned char 的最大值0255
CHAR_MINchar 的最小值-128 或 0127 或 255
CHAR_MAXchar 的最大值-128 或 0127 或 255
SHRT_MINshort 的最小值-3276832767
SHRT_MAXshort 的最大值-3276832767
USHRT_MAXunsigned short 的最大值065535
INT_MINint 的最小值-21474836482147483647
INT_MAXint 的最大值-21474836482147483647
UINT_MAXunsigned int 的最大值04294967295
LONG_MINlong 的最小值-2147483648 或更小2147483647 或更大
LONG_MAXlong 的最大值-2147483648 或更小2147483647 或更大
ULONG_MAXunsigned long 的最大值04294967295 或更大
LLONG_MINlong long 的最小值-92233720368547758089223372036854775807
LLONG_MAXlong long 的最大值-92233720368547758089223372036854775807
ULLONG_MAXunsigned long long 的最大值018446744073709551615

1.2 Windows

https://learn.microsoft.com/zh-cn/windows/win32/winprog/windows-data-types

只列举了常见的,完整的直接去看对应的头文件即可,一般都只有几百行。

很多定义看起来和C语言的定义是重复的,原因主要有:

  • 历史原因,Windows开发并不是和C语言标准的制定是同步的,比如Windows用int作为BOOL。
  • 兼容性:Windows操作系统需要与多种编译器和平台一起工作,包括不仅限于Microsoft Visual C++编译器。
  • 增加程序可读性。

1.21 WinDef.h –> minwindef.h / winnt.h

windef.h -- Basic Windows Type Definitionsminwindef.h -- Basic Windows Type Definitions for minwin partition winnt.h--This module defines the 32-Bit Windows types and constants that aredefined by NT, but exposed through the Win32 API.

windef.h是Windows API的基本类型定义文件,它包含了一些常用的数据类型,宏,结构体等。windef.h实际上是包含了以下几个头文件的:

  • minwindef.h:这个头文件定义了一些基本的数据类型,如BYTE, WORD, DWORD, BOOL等,以及一些常用的数学函数的宏,如max和min。
  • winnt.h:这个头文件定义了一些与Windows NT操作系统相关的数据类型和函数,如HANDLE, PVOID, NTSTATUS等。

  • minwindef.h:
数据类型大小 (字节)简介原始类型
BOOL4布尔值(真或假)int
BYTE1无符号8位整数unsigned char
CHAR18位字符char
INT432位有符号整数int
UINT432位无符号整数unsigned int
LONG432位有符号长整数long
ULONG432位无符号长整数unsigned long
DWORD432位无符号长整数(常用于表示大小和计数)unsigned long
WORD216位无符号整数unsigned short
SHORT216位有符号整数short
USHORT216位无符号短整数unsigned short
FLOAT4单精度浮点数float
DOUBLE8双精度浮点数double
LONGLONG864位有符号长长整数long long
ULONGLONG864位无符号长长整数unsigned long long
LARGE_INTEGER864位有符号长长整数(用于大整数操作)union
  • winnt.h:
数据类型大小 (字节)简介原始类型
BOOLEAN1布尔值 (TRUE 或 FALSE)unsigned char
CHAR18位有符号字符char
UCHAR18位无符号字符unsigned char
SHORT216位有符号短整数short
USHORT216位无符号短整数unsigned short
INT432位有符号整数int
UINT432位无符号整数unsigned int
LONG432位有符号长整数long
ULONG432位无符号长整数unsigned long
LONGLONG864位有符号长长整数__int64
ULONGLONG864位无符号长长整数unsigned __int64
FLOAT4单精度浮点数float
DOUBLE8双精度浮点数double
VOIDN/A无类型N/A
PVOIDN/A指向VOID的指针N/A
PVOID64N/A64位指向VOID的指针N/A
HANDLEN/A句柄,通常用于句柄类型的对象N/A
HMODULEN/A模块句柄,通常用于DLL模块N/A

1.22 BaseTsd.h

Module Name:basetsd.hAbstract:Type definitions for the basic sized types.
数据类型大小 (字节)简介原始类型
INT81有符号 8 位整数char
INT162有符号 16 位整数short
INT324有符号 32 位整数int
INT648有符号 64 位整数long long
UINT81无符号 8 位整数unsigned char
UINT162无符号 16 位整数unsigned short
UINT324无符号 32 位整数unsigned int
UINT648无符号 64 位整数unsigned long long
INT_PTR变量与指针大小相同的有符号整数
UINT_PTR变量与指针大小相同的无符号整数
LONG_PTR变量与指针大小相同的有符号长整数
ULONG_PTR变量与指针大小相同的无符号长整数
SSIZE_T变量有符号大小,足够大以容纳指针的有符号整数
SIZE_T变量无符号大小,足够大以容纳指针的无符号整数

1.23 winerror.h

这个头文件包含了大量的错误码定义,用于在Windows编程中处理各种错误和异常情况。这些错误码以常量的方式定义,以便在编程中引用。

在Windows编程中,通常还会使用函数如 FormatMessage 来将错误码转换为人类可读的错误消息,以便更好地诊断问题。

没必要记:

错误码常量描述
ERROR_SUCCESS操作成功完成
ERROR_INVALID_FUNCTION无效的函数
ERROR_FILE_NOT_FOUND找不到指定的文件
ERROR_PATH_NOT_FOUND找不到指定的路径
ERROR_TOO_MANY_OPEN_FILES打开的文件过多
ERROR_ACCESS_DENIED访问被拒绝
ERROR_INVALID_HANDLE无效的句柄
ERROR_NOT_ENOUGH_MEMORY内存不足
ERROR_INVALID_PARAMETER无效的参数
ERROR_BAD_COMMAND无效的命令
ERROR_NO_MORE_FILES没有更多的文件可以使用
ERROR_WRITE_PROTECT写保护
ERROR_NOT_READY设备未就绪
ERROR_CRC数据校验错误
ERROR_READ_FAULT读取错误
ERROR_GEN_FAILURE一般性失败
ERROR_SHARING_VIOLATION共享冲突
ERROR_LOCK_VIOLATION锁定冲突
ERROR_HANDLE_DISK_FULL句柄或磁盘空间不足
ERROR_NOT_SUPPORTED不支持的功能或操作
ERROR_INVALID_PARAMETER无效的参数
ERROR_INSUFFICIENT_BUFFER缓冲区不足
ERROR_ALREADY_EXISTS已存在
ERROR_FILE_EXISTS文件已存在
ERROR_BUSY设备或文件正在使用中
ERROR_TIMEOUT操作超时
ERROR_NO_MORE_ITEMS没有更多的项目
ERROR_DIRECTORY目录
ERROR_NOT_OWNER不是所有者
ERROR_TOO_MANY_POSTS发送的消息太多
ERROR_PARTIAL_COPY部分复制
ERROR_ARITHMETIC_OVERFLOW算术溢出
ERROR_PIPE_CONNECTED管道已连接
ERROR_PIPE_LISTENING管道正在监听
ERROR_PIPE_NOT_CONNECTED管道未连接
ERROR_INVALID_DATA无效的数据
ERROR_PIPE_BUSY管道忙
ERROR_NO_DATA没有可用数据
ERROR_PIPE_NOT_CONNECTED管道未连接
ERROR_MORE_DATA还有更多数据可用
ERROR_NO_SIGNAL_SENT没有发送信号

1.3 Unix / Linux

C语言标准变量类型在Linux下也有“别名”,定义在等头文件中

C语言变量类型Linux下的别名
charint8_t
unsigned charuint8_t
shortint16_t
unsigned shortuint16_t
intint32_t
unsigned intuint32_t
long longint64_t
unsigned long longuint64_t

通常,在特定系统下,使用相应的C语言变量“别名”是为了增强代码可读性和可移植性。 意思是说:使用C语言标准变量名在不同系统中的大小可能不同,使用“别名”可以很明了地看出来对应的变量大小,比如INT8int8_t ,当你想把它移植到别的系统时可以减少犯错的几率(溢出、截断、对齐)。

二、转义与格式控制

2.1 转义

转义字符用于在字符串常量和字符常量中插入特殊字符或者用于表示无法直接键入的字符。例如,\n用于表示换行,\t用于表示水平制表符,\\用于表示反斜线等。不同编程环境和字符集可能会有一些额外的转义字符或特殊规则,下面是C语言标准中定义的常见转义字符。

转义字符含义
\\反斜线
\'单引号
\"双引号
\a响铃
\b退格
\f换页
\n换行
\r回车
\t水平制表符(tab)
\v垂直制表符
\?问号(用于避免与trigraph序列冲突)
\0空字符(NULL字符)
\xhh十六进制字符(其中hh是两位十六进制数字)
\ooo八进制字符(其中ooo是三位八进制数字)

百分号是%%,如printf("12.5%%");

三个主要的操作系统(Unix/Linux、Windows和macOS)在处理文本文件时使用不同的行结束符:

  • Unix/Linux:
    • 行结束符:\n(换行符,ASCII码为10)。 Unix和Linux操作系统通常使用换行符 \n 来表示行结束。
  • Windows:
    • 行结束符:\r\n(回车符+换行符,即CR LF,ASCII码为13后跟10)。 Windows操作系统通常使用回车符 \r 后跟换行符 \n 来表示行结束。
  • macOS:
    • 行结束符:\r(回车符,ASCII码为13)。 早期的macOS系统(如Mac OS 9及更早版本)使用回车符 \r来表示行结束。但是,现代的macOS系统也可以识别 \n 作为行结束符,因此通常可以与Unix/Linux兼容。

2.2 格式控制

本都是缩写:

整数类型格式控制符:

格式控制符描述
%d以十进制形式输出有符号整数。
%i以十进制形式输出有符号整数。
(可以将其他进制转为十进制输出)
%u以十进制形式输出无符号整数。
%o以八进制形式输出整数。
%x以十六进制形式输出整数(小写字母)。
%X以十六进制形式输出整数(大写字母)。
%ld以长整型十进制形式输出有符号长整数。
%lu以长整型十进制形式输出无符号长整数。
%lo以长整型八进制形式输出长整数。
%lx以长整型十六进制形式输出长整数(小写字母)。
%lX以长整型十六进制形式输出长整数(大写字母)。
%lld以长长整型十进制形式输出有符号长长整数。
%llu以长长整型十进制形式输出无符号长长整数。
%llo以长长整型八进制形式输出长长整数。
%llx以长长整型十六进制形式输出长长整数(小写字母)。
%llX以长长整型十六进制形式输出长长整数(大写字母)。
%hhd以有符号字符型十进制形式输出字符。
%hhu以无符号字符型十进制形式输出字符。
%hho以有符号字符型八进制形式输出字符。
%hhx以有符号字符型十六进制形式输出字符(小写字母)。
%hhX以有符号字符型十六进制形式输出字符(大写字母)。
%jd以intmax_t类型的十进制形式输出整数。
%ju以uintmax_t类型的十进制形式输出整数。
%jo以intmax_t类型的八进制形式输出整数。
%jx以intmax_t类型的十六进制形式输出整数(小写字母)。
%jX以intmax_t类型的十六进制形式输出整数(大写字母)。
%zd以size_t类型的十进制形式输出整数。(有符号)
%zu以size_t类型的十进制形式输出整数。 (无符号)
%zo以size_t类型的八进制形式输出整数。
%zx以size_t类型的十六进制形式输出整数(小写字母)。
%zX以size_t类型的十六进制形式输出整数(大写字母)。
%td以ptrdiff_t类型的十进制形式输出整数。
%tu以ptrdiff_t类型的十进制形式输出整数。
%to以ptrdiff_t类型的八进制形式输出整数。
%tx以ptrdiff_t类型的十六进制形式输出整数(小写字母)。
%tX以ptrdiff_t类型的十六进制形式输出整数(大写字母)。

浮点数类型格式控制符:

格式控制符描述
%f以浮点数形式输出实数。
%e以科学计数法形式输出实数(小写字母e)。
%E以科学计数法形式输出实数(大写字母E)。
%g以%e或%f中较短的形式输出实数。
%G以%E或%f中较短的形式输出实数。
%a以十六进制浮点数形式输出实数(小写字母a)。
%A以十六进制浮点数形式输出实数(大写字母A)。

字符类型和字符串类型格式控制符:

格式控制符描述
%c输出一个字符。
%s输出字符串。

指针类型格式控制符:

格式控制符描述
%p输出指针的地址。

三、ASCII 码

ASCII (American Standard Code for Information Interchange):美国信息交换标准代码,是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。

Bin(二进制)Oct(八进制)Dec(十进制)Hex(十六进制)缩写/字符解释
0000 00000000x00NUL(null)空字符
0000 00010110x01SOH(start of headline)标题开始
0000 00100220x02STX (start of text)正文开始
0000 00110330x03ETX (end of text)正文结束
0000 01000440x04EOT (end of transmission)传输结束
0000 01010550x05ENQ (enquiry)请求
0000 01100660x06ACK (acknowledge)收到通知
0000 01110770x07BEL (bell)响铃
0000 100001080x08BS (backspace)退格
0000 100101190x09HT (horizontal tab)水平制表符
0000 1010012100x0ALF (NL line feed, new line)换行键
0000 1011013110x0BVT (vertical tab)垂直制表符
0000 1100014120x0CFF (NP form feed, new page)换页键
0000 1101015130x0DCR (carriage return)回车键
0000 1110016140x0ESO (shift out)不用切换
0000 1111017150x0FSI (shift in)启用切换
0001 0000020160x10DLE (data link escape)数据链路转义
0001 0001021170x11DC1 (device control 1)设备控制1
0001 0010022180x12DC2 (device control 2)设备控制2
0001 0011023190x13DC3 (device control 3)设备控制3
0001 0100024200x14DC4 (device control 4)设备控制4
0001 0101025210x15NAK (negative acknowledge)拒绝接收
0001 0110026220x16SYN (synchronous idle)同步空闲
0001 0111027230x17ETB (end of trans. block)结束传输块
0001 1000030240x18CAN (cancel)取消
0001 1001031250x19EM (end of medium)媒介结束
0001 1010032260x1ASUB (substitute)代替
0001 1011033270x1BESC (escape)换码(溢出)
0001 1100034280x1CFS (file separator)文件分隔符
0001 1101035290x1DGS (group separator)分组符
0001 1110036300x1ERS (record separator)记录分隔符
0001 1111037310x1FUS (unit separator)单元分隔符
0010 0000040320x20(space)空格
0010 0001041330x21!叹号
0010 0010042340x22双引号
0010 0011043350x23#井号
0010 0100044360x24$美元符
0010 0101045370x25%百分号
0010 0110046380x26&和号
0010 0111047390x27闭单引号
0010 1000050400x28(开括号
0010 1001051410x29)闭括号
0010 1010052420x2A*星号
0010 1011053430x2B+加号
0010 1100054440x2C,逗号
0010 1101055450x2D减号/破折号
0010 1110056460x2E.句号
0010 1111057470x2F/斜杠
0011 0000060480x300字符0
0011 0001061490x311字符1
0011 0010062500x322字符2
0011 0011063510x333字符3
0011 0100064520x344字符4
0011 0101065530x355字符5
0011 0110066540x366字符6
0011 0111067550x377字符7
0011 1000070560x388字符8
0011 1001071570x399字符9
0011 1010072580x3A:冒号
0011 1011073590x3B;分号
0011 1100074600x3C<小于
0011 1101075610x3D=等号
0011 1110076620x3E>大于
0011 1111077630x3F?问号
0100 00000100640x40@电子邮件符号
0100 00010101650x41A大写字母A
0100 00100102660x42B大写字母B
0100 00110103670x43C大写字母C
0100 01000104680x44D大写字母D
0100 01010105690x45E大写字母E
0100 01100106700x46F大写字母F
0100 01110107710x47G大写字母G
0100 10000110720x48H大写字母H
0100 10010111730x49I大写字母I
010010100112740x4AJ大写字母J
0100 10110113750x4BK大写字母K
0100 11000114760x4CL大写字母L
0100 11010115770x4DM大写字母M
0100 11100116780x4EN大写字母N
0100 11110117790x4FO大写字母O
0101 00000120800x50P大写字母P
0101 00010121810x51Q大写字母Q
0101 00100122820x52R大写字母R
0101 00110123830x53S大写字母S
0101 01000124840x54T大写字母T
0101 01010125850x55U大写字母U
0101 01100126860x56V大写字母V
0101 01110127870x57W大写字母W
0101 10000130880x58X大写字母X
0101 10010131890x59Y大写字母Y
0101 10100132900x5AZ大写字母Z
0101 10110133910x5B[开方括号
0101 11000134920x5C\反斜杠
0101 11010135930x5D]闭方括号
0101 11100136940x5E^脱字符
0101 11110137950x5F_下划线
0110 00000140960x60`开单引号
0110 00010141970x61a小写字母a
0110 00100142980x62b小写字母b
0110 00110143990x63c小写字母c
0110 010001441000x64d小写字母d
0110 010101451010x65e小写字母e
0110 011001461020x66f小写字母f
0110 011101471030x67g小写字母g
0110 100001501040x68h小写字母h
0110 100101511050x69i小写字母i
0110 101001521060x6Aj小写字母j
0110 101101531070x6Bk小写字母k
0110 110001541080x6Cl小写字母l
0110 110101551090x6Dm小写字母m
0110 111001561100x6En小写字母n
0110 111101571110x6Fo小写字母o
0111 000001601120x70p小写字母p
0111 000101611130x71q小写字母q
0111 001001621140x72r小写字母r
0111 001101631150x73s小写字母s
0111 010001641160x74t小写字母t
0111 010101651170x75u小写字母u
0111 011001661180x76v小写字母v
0111 011101671190x77w小写字母w
0111 100001701200x78x小写字母x
0111 100101711210x79y小写字母y
0111 101001721220x7Az小写字母z
0111 101101731230x7B{开花括号
0111 110001741240x7C|垂线
0111 110101751250x7D}闭花括号
0111 111001761260x7E~波浪号
0111 111101771270x7FDEL (delete)删除