1.C语言数据类型分布图
2.C语言中变量的定义,命名规则
C语言中变量的定义规则如下:
类型说明符 变量名标示符,变量名标示符,...;
另外C语言中的变量是先定义在使用
C语言的命名规则遵循标示符命名规则,也就是标示符的名称只能由字母,数字,下划线组成,并且第一个字符必须是以字母或者下划线开头,并且标示符的名称不能和关键字同名
还有一点要注意在C语言中标示符区分大小写,也就是Sum和sum是两个不同的标示符
3.C语言中常量的种类
所谓的常量就是在程序运行过程中它的值不可以被改变的量
在C语言中常量分为整数常量(例如:123,-5),实型常量(例如:1.5,1,2E-2),字符常量(例如:\'x\',\'*\'),符号常量(例如:PI)
符号常量的定义规则如下
# define 符号常量名(通常用大写字符表示) 常量
4.整型数据
整型数据这里会讲到5点
(1)整型数据在内存中的存放形式
整型数据在内存中存放形式是以补码形式存放的,正数的三码相同,负数的三码却是不同的,负数的源码符号位不变其它位取反就是反码,反码再加一就是补码
(2)整型变量的分类
unsigned int(无符号基本整型) 0~65535 2
signed int(有符号基本整型) -32768~+32767 2
unsigned short int(无符号短整型) 0~65535 2
signed short int(有符号短整型) -32768~+32767 2
unsigned long int(无符号长整型) -2的31次方到+2的31次方减一 4
signed long int(有符号长整型) 0到+2的32次方减一 4
这里有一道很有味道的题目
#include <stdio.h> void main() { signed int a,b; a=32767; b=a+1; printf("%d\n",b); }
输出结果应该是-32768,书上结果是这么多,但是我用Xcode得到的结果不一样,但是我们这里以书上为准。
分析a=32767,在内存中存放的形式为0111 1111 1111 1111,当它加1则变为1000 0000 0000 0000,从这里我们表面上计算出结果为32768,但是这里的b的类型为有符号基本整型
范围在-32768~+32767,显然得到的结果超过了32767,由于1000 0000 0000 0000是-32768的补码,所以b的结果为-32768
(3)整型常量
整型常量分为十进制常量(数码为0~9,数值前可有+,-号),八进制常量(数码为0~7,必须以0为前缀),十六进制常量(数码为0~9,A~F或者a~f,必须以0x或0X为前缀)
整型常量的类型和整型变量的类型相同也有6种类型,如果要表明某个整型常量为long int型则可以在该常量后面加一个后缀L或者l(例如12L,012L,0x356L),另外通常整型常量
为有符号类型,如果要表示某个整型常量为无符号类型则只要在该常量后面加一个后缀U或者u(例如-1U,在内存中-1的存储形式为1111 1111 1111 1111,这里有加了一个U
表示无符号,则这里的结果为65535)
(4)使用printf()函数输出整型数据
printf函数的格式:
printf("格式控制字符串","输出项列表");
这里输出项可以有0个或多个,多个之间用逗号翻开,并且输出项可以是常量,变量,表达式,函数返回值
这里格式控制字符串中可以分为普通字符和格式说明,普通字符起说明提示作用,格式说明用于规定输出项按照格式说明输出
一下是整型数据的格式字符列表和说明
另外我们还可以在格式符中间附加上控制符,加上L或者l表示输出的数据位长整型,加上m(为正整数)表示输出的数据要占据多个空格
这里还要注意一点当格式符为八进制和十六进制的时候,输出的数据不会出现八进制和十进制的前缀
还要注意一点,如果要在格式控制字符串中输入%,则需要两个%(例如:printf(%%%d,50),结果为%50)
这里有一个很有味道的题目
#include <stdio.h> void main() { signed int a = -1; printf("%d,%i,%o,%x,%X,%u\n",a,a,a,a,a,a); }
我在Xcode 64位苹果本上的结果如下
而在win下的TC上测试结果为
-1,-1,177777,fffffff,FFFFFFF,65535
(5)使用scanf()函数输入整型数据
scanf函数的格式如下
scanf("格式控制字符串",变量地址列表);
scanf函数的格式符和printf函数的格式符是一样的,但是比printf函数多了一个格式控制符*,在格式符中插入*表示输入的数据不存入到变量中
例如下面这个例子
scanf("%d%*d%d",&a,&b);
当输入345回车之后,3将会付给a,5将付给b,4自动跳过不会存入变量b中
另外还要注意在使用scanf函数的时候,输入数据必须按照格式控制字符串中规定的那样数据数据,否则会出错
例如下面这个例子
scanf("a=%d",&a);
输入数据的时候必须输入a=xx回车,如果直接输入xx回车则会出错
同样的
scanf("%d,%d",&a,&b);
这个在输入数据的时候需要用逗号分隔开来,输入xx,xx回车
还要注意一点,如果分隔符号式空格,在输入数据的时候可以使用空格或tab键盘或回车键来代替空格
——————————————————————————————————————————————————————————————————————————————————————
5.浮点数
浮点数这里会讲到4点
(1)浮点变量
浮点小数在内存中存入的方式这里我们不做了解
浮点数的类型分为单精度float(范围在10的正负38次方之间,有效位6到7位,占4字节),双精度double(范围在10的正负308次方之间,有效位15到16位,占8字节),
长双精度long double(范围在10的正负4932次方之间,有效位18到19位,占10字节)
(2)浮点常量
浮点常量分为小数形式(由0~9和小数点以及+,-号组成)和指数形式(由十进制数小数,加阶码标志e或者E以及阶码(十进制整数)组成),例如1.2E2
另外浮点常量默认是双精度double类型,如果要改成单精度float类型则只需加后缀F或者f,例如1.23f,1.3E5F
(3)用printf输出浮点数据
用printf函数输出浮点数的格式和输出整数的格式一样,不过输出浮点数的格式符不同,下面就给出浮点数据格式符的列表
另外还可以在格式符号中加入整数控制输出的占据多个位数,还可以加入.整数控制保留多少位小数,默认保留6位小数
例如:printf("%10.3f",123,45);
(4)用scanf输入浮点数据
用scanf()函数输入浮点数的格式与输入整数格式一样,不同点在格式符,格式符和printf的格式一样,需要注意的是,输入数据是要用&这个符号
另外如果在格式符后面加上一个l,表示要输入双精度浮点数
未完————————————————————————————————待续
最后提供一张不同编译环境下基本数据类型所占内存大小
请发表评论