一、计算机数据表示
高 低
计算机 底层(硬件)描述的最小单位--比特 bite (0 1)--针对于硬件(如上网网速)
8bite--256种状态
计算机 底层(软件)把多个bite组合成一种对象 --字节 Byte--针对于软件(如存储)
8bite=1Byte(字节)=1B
CPU--一个个字节、一个个bite
人--一个个对象(高级语音)
容器--内存--进行管理
二、C语言基本数据类型
数据类型:在内存中分配容器的大小(高级语言内置容器大小为提供操作方便)
翻译官(编译器) 读取代码-------分析-------在内存上实现
读取代码: 单词 标点符号
int a =10;
int a;//声明 a表示int类型的数据类型(容器)--映射到一定大小的内存上
a =10;//使用
ISO C90
char short int long
char (1B)<short<=int(2B 4B)<=long(不能小于4B)
long long:一定表示8B
int:1、表示计算机CPU一个周期能处理的数据大小(与数据总线的位数有关)
2、OS:表示编译器提供的总线容量(2B 4B)
不同操作系统数据类型大小不一致导致程序移植性差
解决方法:
1、sizeof():来计算数据类型在编译器中的大小;如sizeof(int)--(使用%zd输出--针对sizeof制定)
2、数据类型进行重命名--typedef(数据类型起别名)
如:typedef int int8-t;定义一个叫做int8-t的int类型的别名
使用头文件stdint<stdint.h>已完成定义
OS:int--2B typedef int16-t int;
long--4B typedef int32-t long;
OS:int--4B typedef int16-t short;
long--4B typedef int32-t int;
三、进制转换
数据-->数字 字符
十进制-->二进制使用8421码直接转
6=4+2=0100+0010=0110
100=64+32+4=0100 0000+0010 0000+0000 0100=0110 0100
二进制-->八进制
3个二进制==1个八进制
100==0110 0100=001 100 100=1 4 4
十进制 二进制 八进制
二进制-->十六进制
4个二进制==1个十六进制
0110 0100 =64
四、正负数编解码
负数表示方法:补码编码
原码--除符号位取反--+1
最高位负权重,其他位都是正权重
例:-5+2=-3
-5原码:1101
反码:1010
补码:1011
2原码:0010
1011+0010=1101
1101=-1*8+4+1=-3
-1(8bit)
1000 0001
取反:1111 1110=-128+64+......+2=-1
1000 0000-1 = 0111 1111
-128+127=-1
计算机的内存 解码过程
1111 1111------>%d------->-1
------>%u------->(全正权重解码unsigned)
五、c语言赋值
赋值:
A=B B的空间逐位拷贝到A的空间
大容量拷贝到小容量--截断(只保留小容量低位)
小容量拷贝到大容量--补齐(补符号位)
%x:以十六进制显示,默认int大小显示
%hhx:输出一个字节
%hx:输出两个字节
%hd:输出两个字节,十进制补码解码
注:需考虑容量的范围
数的表示:按照一个解码器来解析的
全正权值解码:unsigned--多用于表示状态
负权值解码(补码解码):signed--多用于数学数字表示
char:解码方式具体看编译器
六、关键字unsigned signed
unsigned signed区别:
不影响赋值(逐位拷贝),不限制数据类型的容量
只影响运算操作,限制了修饰的数据的操作行为(< > /)
例:unsigned int a=-2;
int b=-2;
a与b在内存中存储相同,当进行a/2和b/2运算时内部行为不同
内存溢出会造成段错误(segment fault),会造成程序异常退出
在函数参数中需区分需求,选择使用unsigned或者signed
七、printf的查看方法
printf--查看内存工具
%进制选择 d/u x o(x/o无正负数解码)
% 位宽 进制选择
默认位宽位int