一、基础数据类型

基本数据类型有三种:

  • 字符(char)
  • 整数(int)
  • 浮点数(float)

二、字符数据类型

2.1、字符类型声明

  1. // C 语言规定,字符常量必须放在单引号里面。
  2. char c = 'A';

2.2、字符类型与整数

在计算机内部,字符类型使用一个字节(8位)存储。C 语言将其当作整数处理,所以字符类型就是宽度为一个字节的整数。每个字符对应一个整数(由 ASCII 码确定),比如B对应整数66。

  1. char c = 66;
  2. // 等同于
  3. char c = 'B';
  4. //输出 字符代表的整数
  5. printf("%d\n", c);

2.3、转义字符

单引号本身也是一个字符,如果要表示这个字符常量,必须使用反斜杠转义。

  1. char t = '\'';

ASCII 码定义的一些无法打印的控制字符

  • \a:警报,这会使得终端发出警报声或出现闪烁,或者两者同时发生。
  • \b:退格键,光标回退一个字符,但不删除字符。
  • \f:换页符,光标移到下一页。在现代系统上,这已经反映不出来了,行为改成类似于\v。
  • \n:换行符。
  • \r:回车符,光标移到同一行的开头。
  • \t:制表符,光标移到下一个水平制表位,通常是下一个8的倍数。
  • \v:垂直分隔符,光标移到下一个垂直制表位,通常是下一行的同一列。
  • \0:null 字符,代表没有内容。注意,这个值不等于数字0。

进制表示字符

  • \nn:字符的八进制写法,nn为八进制值。
  • \xnn:字符的十六进制写法,nn为十六进制值。

三、整数数据类型

3.1、简介

3.1.1、整数类型声明

  1. int a = 1;

3.1.2、整数类型范围

  • 2个字节,16位:-32,768 到 32,767。
  • 4个字节,32位:-2,147,483,648 到 2,147,483,647。
  • 8个字节,64位:-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。

3.2、整数正负数

  • signed : 表示一个类型带有正负号,包含负值
  • unsigned: 表示该类型不带有正负号,只能表示零和正整数
  • 对于int类型,默认是带有正负号的,也就是说int等同于signed int。
  • 整数变量声明为unsigned的好处是,同样长度的内存能够表示的最大整数值,增大了一倍。比如,16位的signed int最大值为32,767,而unsigned int的最大值增大到了65,535。 ```c signed int a; // 等同于 int a;

//声明不带正负号的整数 unsigned int a;

signed char c; // 范围为 -128 到 127 unsigned char c; // 范围为 0 到 255

//非负数整数 unsigned int b =-10; printf(“%u\n”,b); //会造成溢出

  1. <a name="jZ8kb"></a>
  2. ### 3.3、整数的子类型
  3. - short int(简写为short):占用空间不多于int,一般占用2个字节(整数范围为-32768~32767)。
  4. - long int(简写为long):占用空间不少于int,至少为4个字节。
  5. - long long int(简写为long long):占用空间多于long,至少为8个字节。
  6. ```c
  7. //声明
  8. short int a;
  9. long int b;
  10. long long int c;
  11. //C 语言允许省略int
  12. short a;
  13. long b;
  14. long long c;

3.4、整数类型的极限值

C 语言的头文件limits.h提供了相应的常量

  • SCHAR_MIN,SCHAR_MAX:signed char 的最小值和最大值。
  • SHRT_MIN,SHRT_MAX:short 的最小值和最大值。
  • INT_MIN,INT_MAX:int 的最小值和最大值。
  • LONG_MIN,LONG_MAX:long 的最小值和最大值。
  • LLONG_MIN,LLONG_MAX:long long 的最小值和最大值。
  • UCHAR_MAX:unsigned char 的最大值。
  • USHRT_MAX:unsigned short 的最大值。
  • UINT_MAX:unsigned int 的最大值。
  • ULONG_MAX:unsigned long 的最大值。
  • ULLONG_MAX:unsigned long long 的最大值。 ```c

    include

    include

printf(“int 最小值 %d”,INT_MIN); printf(“int 最大值 %d”,INT_MAX);

  1. <a name="Qg02B"></a>
  2. ### 3.5、整数进制
  3. - 八进制使用0作为前缀,比如017、0377。
  4. - 十六进制使用0x或0X作为前缀,比如0xf、0X10。
  5. printf()的进制相关占位符如下
  6. - %d:十进制整数。
  7. - %o:八进制整数。
  8. - %x:十六进制整数。
  9. - %#o:显示前缀0的八进制整数。
  10. - %#x:显示前缀0x的十六进制整数。
  11. - %#X:显示前缀0X的十六进制整数。
  12. <a name="wJYmF"></a>
  13. ## 四、浮点数数据类型
  14. 任何有小数点的数值,都会被编译器解释为浮点数。所谓“浮点数”就是使用 m * b^e 的形式,存储一个数值,m是小数部分,b是基数(通常是2),e是指数部分。
  15. <a name="RPHlN"></a>
  16. ### 4.1、浮点数声明
  17. ```c
  18. float c = 10.5;

4.2、浮点数类型长度

  • float:占用4个字节(32位)
  • double:占用8个字节(64位),至少提供13位有效数字。
  • long double:通常占用16个字节。

五、布尔类型

5.1、简介

C 语言原来并没有为布尔值单独设置一个类型,而是使用整数0表示伪,所有非零值表示真。
头文件 stdbool.h 定义了另一个类型别名bool,并且定义了true代表1、false代表0。

  1. int x = 1;
  2. if (x) {
  3. printf("x is true!\n");
  4. }

5.2、声明

  1. #include <stdbool.h>
  2. bool flag = false;

六、sizeof 运算符

sizeof是 C 语言提供的一个运算符,返回某种数据类型或某个值占用的字节数量。

  1. // 参数为数据类型
  2. int x = sizeof(int);
  3. // 参数为变量
  4. int i;
  5. //返回得到int类型占用的字节数量(通常是4或8)
  6. sizeof(i);
  7. // 参数为数值
  8. //第三个示例返回浮点数3.14占用的字节数量,
  9. //由于浮点数的字面量一律存储为 double 类型
  10. //所以会返回8,因为 double 类型占用的8个字节。
  11. sizeof(3.14);

七、类型转换

7.1、赋值运算

7.1.1、浮点数赋值给整数变量

  1. // 浮点数赋予整数变量时,C 语言直接丢弃小数部分,而不是四舍五入。
  2. int x = 3.14;

7.1.2、整数赋值给浮点数变量

  1. //整数赋值给浮点数变量时,会自动转为浮点数。
  2. float y = 12 * 2;

7.1.3、窄类型赋值给宽类型

  1. //字节宽度较小的整数类型,赋值给字节宽度较大的整数变量时
  2. //会发生类型提升,即窄类型自动转为宽类型。
  3. char x = 10;
  4. int i = x + y;

7.1.4、宽类型赋值给窄类型

  1. //字节宽度较大的类型,赋值给字节宽度较小的变量时,会发生类型降级,自动转为后者的类型。
  2. //这时可能会发生截值(truncation),系统会自动截去多余的二进制位,导致难以预料的结果。
  3. // i(二进制形式为101000001,共9位)
  4. // ch 只能容纳8位 变成了01000001
  5. int i = 321;
  6. char ch = i; // ch 的值是 65 (321 - 256)

7.2、混合类型的运算

  • (1)整数与浮点数混合运算时,整数转为浮点数类型,与另一个运算数类型相同。
  • (2)不同的浮点数类型混合运算时,宽度较小的类型转为宽度较大的类型,比如float转为double,double转为long double。
  • 3)不同的整数类型混合运算时,宽度较小的类型会提升为宽度较大的类型。

7.3、函数

函数的参数和返回值,会自动转成函数定义里指定的类型。

  1. int dostuff(int, unsigned char);
  2. char m = 42;
  3. unsigned short n = 43;
  4. long long int c = dostuff(m, n);

7.4、类型的显式转换

  1. //手动转换为 long int 类型
  2. long int y = (long int) 10 + 12;

八、可移植类型

程序员有时控制准确的字节宽度,这样的话,代码可以有更好的可移植性,头文件stdint.h创造了一些新的类型别名。

8.1、精确宽度类型(exact-width integer type)

  • int8_t:8位有符号整数。
  • int16_t:16位有符号整数。
  • int32_t:32位有符号整数。
  • int64_t:64位有符号整数。
  • uint8_t:8位无符号整数。
  • uint16_t:16位无符号整数。
  • uint32_t:32位无符号整数。
  • uint64_t:64位无符号整数。

    8.2、最小宽度类型(minimum width type)

  • int_least8_t

  • int_least16_t
  • int_least32_t
  • int_least64_t
  • uint_least8_t
  • uint_least16_t
  • uint_least32_t
  • uint_least64_t

8.3、最快的最小宽度类型(fast minimum width type)

  • int_fast8_t
  • int_fast16_t
  • int_fast32_t
  • int_fast64_t
  • uint_fast8_t
  • uint_fast16_t
  • uint_fast32_t
  • uint_fast64_t

8.4、可以保存指针的整数类型

  • intptr_t:可以存储指针(内存地址)的有符号整数类型。
  • uintptr_t:可以存储指针的无符号整数类型。

    8.5、最大宽度整数类型,用于存放最大的整数

  • intmax_t:可以存储任何有效的有符号整数的类型。

  • uintmax_t:可以存放任何有效的无符号整数的类型。

参考