计算机内存存储数据的部位有硬盘和内存
硬盘存储的是可见数据,内存存储的是不可见数据
硬盘,内存所存储的数据都是二进制数据
我们使用的计算机室为了实现数据存储,数据运算,数据管理
[1]我们(程序员)必须了解数据是如何存储到计算机中的
[2]我们(程序员)必须了解,我们如何通过代码将数据存储到计算机中,以及如何使用这些数据
[对于人类]我们人类通常对于十进制数据更加熟悉
[对于计算机]计算机通常用二进制来存储数据,因为二进制对于计算机而言比较容易实现
内存存数数据的基本单元是三极管(导通,截止,反向击穿)
计算机中表示数据的方式有 二进制,八进制,十进制,十六进制
二进制:由0和1两种字符组成,前缀为0b,例子:0b1001
八进制:由0~7八种字符组成,前缀为0,例子:0755
[应用:文件权限]
d rwxr-xr-x=d rwx r-x r-x
= 111 101 101
= 7 5 5
=0755
第一组:文件所有者得权限
第二组:文件所有者所在小组的其他成员的权限
第三组:文件所有者的小组之外其他小组的权限
十进制:由0~9十种字符组成
十六进制:由09和AF十六种字符组成,前缀为0x,例子:0x1a,0x799
[应用:颜色表示]
颜色的三原色:红 绿 蓝
#FF0000 —红色
#00FF00 —绿色
#000000 —黑色
#FFFFFF —白色
[注]八进制,十六进制的诞生时为了解决两个问题:
(1)二进制数据本身不是很直观(无法很容易地看懂)
(2)十进制数据转成二进制数据,转换过程必须使用除2法,比较麻烦
1.二进制 转 十进制
0b10010=0 * 2^0 + 1 * 2^1 + 0 * 2^2 + 0 * 2^3 + 1 * 2^4
=1 * 2^1 + 1 * 2^4
=18
[注]二进制数据 从右往左数,依次是 第0,1,2......位
转换方法:二进制数据的每一位数值,乘以2的位数次方,然后全部相加得到十进制结果
2.十进制 转 二进制
18=0b10010
转换方法:除2法,余数从下往上数
3.二进制 转 八进制
0b10010=010 010
= 2 2
=022
转换方法:二进制转八进制,从右往左,每三位一取作为一组,高位不够补0
4.二进制 转 十六进制
0b10010=0001 0010 0b111101=0011 1101
= 1 2 = 3 d
=0x12 =0x3d
转换方法:二进制转十六进制,从右往左,每四位一取作为一组,高位不够补0
二进制数据的三种形态:原码,反码,补码
任何一个数据存储到计算机中,必须分配有固定大小的内存单元
而在计算机中,最小的数据单元为字节
1字节 == 8个二进制位
1.原码
一个二进制数据的原码是由符号位和数值位构成,符号位占一位,其他位就是数值位。符号位在最高位
正数的符号位为0,负数的符号位为1
在确定字节数的情况下,最高位作为符号位,其他位用来表示数值的绝对值大小
例:1字节3的原码 0000 0011
1字节-3的原码 1000 0011
[结论] 二进制的原码无法正确运算,计算机不会采用原码来计算数据
2.反码
在确定字节数的情况下,正数的反码和原码一样;
负数的反码,符号位不变,其他位取反(1变0,0变1)
例:0000 0011 1字节3的反码
1111 1100 1字节-3的反码
[结论] 二进制的反码无法正确运算,计算机不会采用反码来计算数据
3.补码
正数的补码和原码、反码一样,负数的补码是 反码加1
例:0000 0011 1字节的3的补码
1111 1101 1字节的-3的补码
[注]对补码再求一次补码得到原码
计算机中是以二进制的形式存储、计算数据的
[结论]计算机是以二进制的补码形式存储、计算数据的,因为补码可以正确运算
4.总结
八进制数据前缀为0
十六进制数据前缀为0x
二进制数据前缀为0b
打印二进制数据,没有特定的打印格式!!!
打印八进制数据,用%o
打印十进制数据,用%d
打印十六进制数据,用%x
程序中存在多种数据,但是数据总体上讲可以分为两种:常量数据 和 变量数据
C语言中的基本数据类型有三类:整型,字符型,浮点型(实型)
整型:关键字为 int,short,long
[注] 使用整型的关键字可以定义整型变量,用来存储整数
字符型:关键字为 char
[注] 使用字符型的关键字可以定义字符型变量,用来存储字符常量
浮点型:关键字为 float,double
[注] 使用浮点型的关键字可以定义浮点型变量,用来存储带小数点的数
标识符的命名规则:
<1>必须由数字,字母,下划线中的一种,或多种组成.
<2>不能以数字开头.
<3>不能和系统预定义的关键字重复
正确表示的标识符可以用来给变量,函数,指针变量,结构体等等命名.
[整型] int,short,long
1.整型变量的定义
int i;//在程序运行时,会向计算机申请4个字节内存单元,这个内存单元的名字就用i表示,使用i就 如果使用分配的4字节内存单元.
short s;//会向计算机申请2个字节内存单元.
long l;//会向计算机申请8个字节内存单元.
//使用sizeof(xxx) 可以测得某个变量所占内存空间大小
printf("%ld\n",sizeof(i));
printf("%ld\n",sizeof(s));
printf("%ld\n",sizeof(l))
2.整型变量的初始化
//初始化,指的是在变量定义的同时通过赋值号给变量赋一个初始值.
// = , 赋值号
int i5 = 100;
3.整型变量的赋值
//赋值,指的是在变量定义之后,给变量赋一个新值.
//后赋的值 会覆盖掉之前存的值.
i5 = 200;
4.整型变量的输入/输出
类型 | 输入格式 | 输出格式 |
---|---|---|
int | %d | %d |
short | %hd | %hd |
long | %ld | %ld |
[注] 数据输入使用scanf语句
数据输出使用printf语句
//可以通过scanf语句给变量i赋值,赋的值是通过键盘输入的.
scanf("%d",&i);//& 是取地址符,可以取得变量的地址(内存中的地址)
整型变量的数据表示范围:
在程序中使用int,short,long所定义的变量默认是有符号类型的变量
有符号整型变量数据表示范围是根据变量所占内存大小而定的
基本整型(int) -2^31 ~ 2^31-1 -21亿 ~ 21亿
短整型(short) -2^15 ~ 2^15-1
长整型(long) -2^63 ~ 2^63-1
0111 1111 ~~ 1111 1111 == 2^31-1
1000 0000 ~~ 0000 0000 == -2^31
1111 1111 ~~ 1111 1111 == -1
如果需要在程序中定义无符号整型变量,需要在int等关键字前加unsigned
unsigned int i;
无符号 基本整型(unsigned int) 0~2^32-1
无符号 短整型(unsigned short) 0~2^16-1
无符号 长整型(unsigned long) 0~2^64-1
字符变量
定义字符变量使用char
定义无符号字符变量使用 unsigned char
定义字符变量是用来存储字符数据的,例如‘a’‘9’‘+’
1.定义一个字符变量
//定义(有符号)字符变量使用 char
char c;//刚定义出来的字符变量,如果不初始化,值无法确定
//字符变量 占 1字节内存
printf("%ld\n",sizeof(c));
//有符号字符变量存储数据范围:-2^7 ~ 2^7-1
//无符号字符变量存储数据范围:0 ~ 255
2.字符变量的初始化
char c1='a';
char c2='+';
3.字符数据的输入/输出
输入:
scanf(“%c”,&c);
输出:
printf(“%c\n”,c);
浮点型变量
定义浮点型变量可以使用的关键字有:float,double
浮点型变量 用来存储带小数点的数
1.浮点型变量的定义
//float,double
//float 定义的变量,称为“单精度浮点型”变量,可以存储小数点后6-8位
//double 定义的变量,称为“双精度浮点型”变量,可以存储小数点后13-15位
float f;//定义float类型变量,变量f会占用4字节内存空间
double d;//定义double类型变量,变量d会占用8字节内存空间
printf("%ld\n",sizeof(f));
printf("%ld\n",sizeof(d));
2.浮点型变量的初始化
float f1=3.14f;
double d1=6.28;
//打印浮点型变量的值
//输单精度浮点型数据,用%f
//输出双精度浮点型数据,用%lf
//%f,%lf,默认输出的数据都保留小数点后6位
printf("%f\n",f1);
printf("%lf\n",d1);
3.浮点型变量的赋值
//后赋的值,会覆盖之前的值
f1=6.28f;
printf("%f\n",f1);
//我们可以通过 %m.nf 控制输出格式
//m ,数据所占总字符宽度
//n,小数点后保留n位
f1=3.14f;
printf("%.2f\n",f1);
内存大小
类型 | 内存大小(32) | 内存大小(64) |
---|---|---|
int | 4 | 4 |
short | 2 | 2 |
long | 4 | 8 |
char | 1 | 1 |
float | 4 | 4 |
double | 8 | 8 |
数据输入/输出格式
类型 | 输入/输出格式 |
---|---|
int | %d |
short | %hd |
long | %ld |
char | %c |
float | %f |
double | %lf |
unsigned int | %u |
unsigned short | %hu |
unsigned long | %lu |
不同进制数据—输入/输出格式
进制 | 格式 |
---|---|
八进制 | %o |
十进制 | %d |
十六进制 | %x |
[注] %i,可以用来输出各种进制的数据
输入scanf的工作原理
程序开始执行后,会在scanf语句处停下来,等待用户输入数据,一旦用户输入了数据,不管输入了多少数据、什么类型的数据,通通会在用户按下回车键时被写入到[输入缓冲区],然后scanf才从[输入缓冲区]中去取对应格式的数据
如果当scanf语句从[输入缓冲区]中取数据时,如果有scanf语句想要的特定格式的数据,直接读走数据,就不会等待用户输入
只有在[输入缓冲区]中没有数据,没有特定格式的数据,才会等待用户输入
[结论] scanf读取数据时,是首先从[输入缓冲区]中取数据的
清除[输入缓冲区]中的所有字符:
scanf("%*[^\n]");
scanf("%*c");
输出printf的工作原理
当程序执行到printf语句时,会把需要输出的字符串挨个写入到[输出缓冲区],当遇到[输出缓冲区]刷新条件时,才会把[输出缓冲区]中的数据显示到终端输出
缓冲区刷新的条件
<1> \n
<2> 程序结束
<3> 手动刷新 fflush(stdout)
<4> 当缓冲区满 4096字节(4K)
1字节==8二进制位
1024字节==1KB
1024KB==1MB
1024MB==1GB
1024GB==1TB
网友评论