第二章——数据和C

数据类型关键字

最初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));
} 

猜你喜欢

转载自blog.csdn.net/qq_44923545/article/details/106271904