数据类型关键字
最初K&R给出关键字 | C90标准添加的关键字 | C99标准添加的关键字 |
---|---|---|
int | signed | _Boll |
long | void | _Complex |
short | _Imaginary | |
unsigned | ||
char | ||
float | ||
double |
- C语言中,用int关键字来表示基本的整数类型(long、short。unsigned)和C99的signed提供基本整数类型的变式。
- char 关键字用于指定字母和其他字符,也可表示较小整数。
- float、double、long double表示带小数点的数。
- _Bool表示布尔值(true、false)。
- _Complex、_Imaginary表示复数和虚数。
位,字节和字——描述计算机数据单元或存储单元的术语
位(bit)最小的存储单元,可以存储0或1,是计算机内存的基本构建块。
字节(byte)是常用计算机存储单位。对几乎所有机器,一字节均为8位
字(word)是设计计算机时给定的自然存储单位,计算机的字长越大,数据转移越快,允许的内存访问越多。例如个人计算机字长从16位,到32,到目前的64位。
C语言的基本数据类型:
(一)int 类型:
#include <stdio.h>
int main()
{
int a, b, c, d; //声明 int 变量
a = 1;
b = 2, c = 3, d = 4;
int A = 1, B = 2; //声明并初始化
int C, D = 4; //有效声明,但是这里没有给变量 C 赋初值
C = 3;
printf("a = %d b = %d c = %d d = %d\n",a,b,c,d);
printf("A = %d B = %d C = %d D = %d\n",a,b,c,d);
}
注:
- C语言把不包含小数点和指数的数作为整数。因此1和-1是整数,1
.0与0.1E1(表示0.1乘以10的一次方)不是整数
。 %d称为转换说明
,它指定 printf()应使用什么格式来显示一个值。- 格式化字符串中的
每个 %d 都与待打印变量列表的 int 值匹配
。这个变量可以说 int 类型变量,int 类型常量,其值为 int 类型的表达式。
打印八进制和十六进制整数:
/*
2020年5月22日8:19
目的:
测试%x %X %#x %#X的用法
测试%o %#o 的用法
*/
# include <stdio.h>
int main(void)
{
int x = 47; //100是十进制
printf("十六进制输出\n");
printf("%x\n", x); //输出结果是: 2f
printf("%X\n", x); //输出结果是: 2F
printf("%#X\n", x); //输出结果是: 0X2F %#X推荐使用
printf("%#x\n", x); //输出结果是: 0x2f
printf("八进制输出\n");
printf("%o\n", x); //输出结果是: 57
printf("%#o\n", x); //输出结果是: 057
printf("十进制输出\n");
printf("%d\n", x); //输出结果是: 47
return 0;
}
/*
在 Dev-C++ 5.11 中的输出结果是:
------------------------
十六进制输出
2f
2F
0X2F
0x2f
八进制输出
57
057
十进制输出
47
------------------------
总结:
*/
C语言中输出不同进制的数要使用不同进制的转换说明符:
- 十进制————%d
- 八进制————%o,如果要输出表示八进制数的前缀使用 %#o
(这里是小写字母o)
- 十六进制————
%x,%X。如果要打印前缀使用 %#x 或 %#X 。具体输出看上面例子
(二) 其他整数类型:
类型关键字 | 用法 |
---|---|
short int(可简写为 short) | 占用的存储空间比可能 int 少,short 是有符号类型 |
long int(可简写 long) | 占用存储空间比可能 int 多,long是有符号类型 |
long long int(可简写 long long) | 占用空间可能比long多,该类型至少占64位,long long 是有符号类型 |
unsigned int(可简写 unsigned) | 用于表示非负值的整数,由于没有符号位,所以可以表示更大的数 |
c90标准在类型前面添加 unsigned |
unsigned long int = unsigned long、unsigned short int = unsigned short |
c99标准在类型前面添加 unsigned |
unsigned long long int = unsigned long long(表示无符号数) |
在任何有符号数前添加 signed | 可强调使用有符号类型的意图short = short int = signed short = signed short int(表示同一种类型) |
注:
- 现在个人计算机最常见的设置long long 占 64位, long 占 32 位 short、int占16位。-------
系统的不同,每种类型的整数所占的位数可能不同。
- 对于long 占用 比 int 大的系统,使用long类型会减慢运算速度,如需必要,请不要使用long类型
整数溢出问题
/*
2020年 5月22日 9:13
目的 :测试整数溢出
*/
#include <stdio.h>
int main()
{
int i = 2147483647;
unsigned int j = 4294967295;
printf("%d %d %d\n", i, i+1, i+2);
printf("%d %d %d\n", j, j+1, j+2);
return 0;
}
/*
Dev-C++ 5.11 输出结果
2147483647 -2147483648 -2147483647
-1 0 1
*/
- 上面程序整数j ,达到最大值时会从起点开始(变为最小值),不过无符号整数 j 是从 0 开始,有符号小数是从 负数开始。
(三)char 类型
本质上来说char 类型是整数类型,插入类型实际存储的是整数而不是字符。
- 计算机数字编码来处理字符(常用编码 ASCII 码)用特定整数来表示特定字符。
- 标准的ASCII码的范围是0———127,所以7位二进制就可表示,通常将char类型定义为8位的存储单元
/*
2020年 5月22日 9:38
目的 :字符初始化
*/
#include <stdio.h>
int main()
{
char a = 'a'; //声明并初始化话一个字符变量 a
char b;
b = 'B' ; //为字符变量 b 符值,其中 'B' 是一个字符常量
a = 65 ; //由于char类型存储的就是整数类型数据,ASCII中 65 对应的是 字符'A',不建议采用这种方式
printf("%c %c", a, b);
}
/*
Dev-C++ 5.11 输出结果
A B
*/
非打印字符:
- 浏览 ASCII 码我们发现,有一些字符无法打印出来,例如(退格,换行等)
如果要使用这些字符: - 方法一:利用整数。查询ASCII 表,找到对应字符的数值。 char a = 7;a 就代表了查询出的字符。
- 方法二:转义字符序列
转义序列 | 含义 |
---|---|
\a | C90新增的警报字符(是否能产生听到或看到的警报,取决于计算机硬件) |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ \ | 反斜杠(\) |
\ ’ | 单引号 |
\ " | 双引号 |
\ ? | 问号 |
\ 0oo | 八进制值(oo必须是八进制,每个o代表0----7中的一个数)与10进制表示字符相同 |
\ xhh | 十六进制值(hh必须是八进制,每个o代表0----f中的一个数) |
注意
- beep = ‘\007’ 即使没有前缀0,编译器处理这种写法是仍然解释为把进制
- 无论普通字符,还是转义字符,只要是双括号括起来的字符集合就无需使用单括号括起来。如 \n。
输出字符
/*
2020年 5月22日 10:8
目的 :字符打印
*/
#include <stdio.h>
int main()
{
char ch;
printf("用户输入字符\n");
scanf("%c", &ch); //从键盘端输入一个字符
printf("字符 %c 对应的整数位 %d", ch, ch);
return 0;
}
/*
Dev-C++ 5.11 输出结果
用户输入字符
a
字符 a 对应的整数位 97
*/
注:C90标准中,C语言允许 char 前面使用signed 或 unsigned。这是因为有些编译器把 char 实现为有符号整型。
(四)_Bool 类型
- C99 标准添加了 _Bool 类型,用于表示布尔值,即逻辑true,false。
- C语言用 1 表示true,0 表示 false, 所以 _Bool 类型实际也是一种整数类型。但原则上只占用一位存储空间。
(五)float 、double 以及 long double l类型
- float 类型必须能有效表示前六位
- double 类型必须能有效表示10位有效数字
浮点常量示例:
- -1.56E+12 (等价于-1.56乘以10的12次方)-
- 浮点型常量的基本形式:
有符号数字(包括小数点),后面紧跟e或E,最后一位表示10的指数
- 正号可以省略,可以没有小数点(如 2E5 ),或指数部分(如 19.28 )但不能同时省略。
可省略小数部分(如 3.E16--(E前面有小数点))或省略整数部分(如 .45E6(4前面有小数点)),不能同时省略
。
打印浮点值:
默认情况下浮点型常量是double类型的精度。
- 在浮点数后面加上
f 或 F 可覆盖默认设置,变为float类型精度
- 加上
l (这里不是一)或 L 变为 long double类型
- C99添加了一种新的浮点数表示,用p和P分别表示e与E,用2的幂代替10的幂,例 0xa.1fp10;表示一个浮点型常量
/*
2020年 5月22日 11:47
目的 :打印浮点值
*/
#include <stdio.h>
int main()
{
float aboat = 32000.0;
double abet = 2.14e9;
long double dip = 5.32e-5L;
printf("%f can be written %e\n", aboat, aboat); // %f 转换说明 对应 float,double类型浮点数
//下一行要求支持c99或其中相关特性
printf("And it's %a in hexadecinmal, powers of 2 notation\n", aboat); //以十六进制的指数形式输出aboat
printf("%f can be written %e %E\n", abet, abet,abet); // %e 或 %E用 指数计数法打印该数,
printf("%Lf can be written %Le\n", dip, dip); // %Lf。%Le或 %La 用于打印long double类型浮点数
//如果支持十六进制格式的浮点数 用 a 和 A 代替 e与 E,即可 %a、%A
return 0;
}
(六)类型大小:
sizeof()是 C 语言的内置运算符,
以字节为单位给出指定类型大小。这个不是函数
/*
2020年 5月22日 11:58
目的 :测试类型长度
*/
#include <stdio.h>
int main()
{
printf("int--------%d\n", sizeof(int));
/* C99 和 C11 为类型大小提供了 %zd 转换说明符,不支持 C99、C11的编译器可用 %u 或 %lu 代替%zd */
printf("int--------%zd\n", sizeof(int));
printf("int--------%u\n", sizeof(int)) ;
printf("int--------%lu\n", sizeof(int));
}