1、什么是CPU和RAM?
CPU(中央处理器):处理器,用来计算数据。RAM(随机存取存储器):内存,用来存储数据
日常中所说的“32GB”的B指的是byte(字节),1byte=8bit(位)
CPU与RAM中有三条总线:
1.地址总线:
- 有几位就有多少条地址总线,32位有32条总线;64位有64条总线。
- 每根线只有两种状态:0和1,如果想要访问编号0,那么32根线上都是0;如果要访问3,那么后两根线是11(二进制)。相当于通过地址总线来选择要访问的内存到底用的是哪个格子的
- 排列下来有2^32次方个,2^32/1024/1024/1024最大寻址空间有4G
- CPU是64位,可以运行64位或32位软件(有一半是空的);但是32位CPU不能运行64位软件(存在RAM中)
2.数据总线
3.控制总线
1.1 关于变量存放的方法:
定义的变量会在RAM内存空间中给出一部分空间用来存放数据,如果变量大小写名不一样,代表着两个不同的内存空间,变量之所以可以改变数值是因为有内存空间。
2 、数据类型
2.1 大小端
在学习数据类型之前需要弄清数据的存储方式,是如何存储到内存当中的。
数据存储有两种方式:大端和小端
大端序(Big Endian):最高有效字节存储在最低的内存地址,而最低有效字节存储在最高的内存地址。
小端序(Little Endian):最低有效字节存储在最低的内存地址,而最高有效字节存储在最高的内存地址。
假设有一个16位整数:0x12345678。
在大端中,存储的顺序为:0x12 0x34 0x56 0x78
在小端中,存储的顺序为:0x78 0x56 0x34 0x12
2.2 整型数据
2.2.1 整型常量
整型常量有三种表示方法
-
十进制数:123、-324、5
-
八进制数:最大数值是7且都以0开头的数,0123表示八进制数123;1234567
-
十六进制数:开头加0x(0X),比如0x123代表十六进制123;123456789ABCDEF
2.2.2 整型变量表示方法
整型类型:(8个):short
、int
、long (int)
、long long (int)
、(unsigned/signed(默认))
int型存放数据方式
有符号位 | 无符号位 | |
最大 | 2的31次方-1 | 2的32次方-1 |
最小 | -2的31次方 | 0 |
2.2.3 整型变量存放数据原理
-
int n=100
-
0x00000064
-
0000 0000 0000 0000 0000 0000 0110 0100
-
00 00 00 64
-
-
int n=-100:原码-反码-补码,符号位由最高位决定,0代表正,1代表负,其最根本原因如下:
-
0x00000064
-
将100表示为8位的二进制:
0000 0000 0000 0000 0000 0000 0110 0100
-
计算其补码,即取反并加1:
-
取反:
1111 1111 1111 1111 1111 1111 1001 1011
-
加1:
1111 1111 1111 1111 1111 1111 1001 1100
-
-
FF FF FF 9C
-
注意:当用printf打印的时候,%d表示有符号十进制打印,要注意需要打印的是几进制数,必要需要进行进制转换(原码反码补码的操作)
2.3 浮点型
2.3.1 浮点常量表示方法:
1. 十进制小数:1.2、0.12、123.0
2. 指数形式:123e3表示123×10^3
2.3.2 浮点变量表示方法:
1. double(双精度浮点型)8个字节
2. float(单精度浮点型)4个字节
在对两个数据做比较时,要注意变量类型要一致
比如
float a=0.9;
if(a==0.9)
{
printf("yes");
}
else printf("no");
输出no,应当改成if(a==0.9f)
,具体原因可以查看sizeof(0.9)的大小和sizeof(a)的大小
2.3.3 浮点变量存储数据原理:
三步:符号位、阶码、尾数
2.4 字符型
1.char
- 1字节(8bit),最高位符号位
- 使用
' '
引用 " "
const char* 打印的地址,要注意
2.unsigned char:1字节(8bit),无符号位
3、Printf
3.1 打印格式指示符
printf
函数中的格式化字符串中可以使用不同的格式指示符(format specifiers)来指定要打印的变量的类型和格式
-
整数类型:
-
%d
:有符号十进制整数(常用) -
%ld
:long long int型 -
%u
:无符号十进制整数 -
%o
:无符号八进制整数 -
%x
:无符号十六进制整数(小写字母) -
%X
:无符号十六进制整数(大写字母)
-
-
浮点数类型:
-
%f
:浮点数(小数)(常用) -
%e
:以指数形式表示的浮点数(小写字母) -
%E
:以指数形式表示的浮点数(大写字母)
-
-
字符类型:
-
% c
:字符char -
%s
:字 符串
-
-
指针类型:
%p
:指针地址
3.2 转义字符
在printf打印中使用
3.3 小数截断
用整型打印浮点型,将小数截断,只打印整数部分
3.4 高位截断
使用短字节打印长字节,需要将高位截断,打印低位数据:用short 打印int
short s;
char z;
int i = 0x12345678;
s = i;
z = i
printf("%d \n ", s);
printf("%d \n ", z);
输出:
22136(0x5678)
120 (0x78)
3.5 符号位扩展(前提类型是有符号)
使用长字节打印短字节,补齐高位,由最高位决定所补是0还是1,如果补0代表正数,如果补1代表负数,进行补码:用int 打印short
short s;
char z;
int i = 0x12345678;
s = i;
z = i
printf("%d \n ", s);
printf("%d \n ", z);
输出:
22136(0x5678)
120 (0x78)
4、运算符
%求余运算符
数据类型必须是整型或者兼容整型
分母不能为0
符号与左操作数有关,与右操作数无关
i++:先用再加。++i:先加再用。
三目运算符 ? :
布尔表达式?表达式1:表达式2
运算过程:如果布尔表达式的值为 true ,则返回 表达式1 的值,否则返回 表达式2 的值
5、关键字
define 声明变量赋值
#define one 100
const :
用于声明常量,表示变量的值不能被修改。const关键字可以用于声明常量指针,也可以用于函数参数,以确保函数不会修改参数的值。
const int i=100;
continue:
用于终止当前循环的迭代,转而执行下一次迭代。在循环中,continue会跳过本次循环体内剩余的代码,直接进行下一次迭代。
default:
在switch语句中用于标记默认情况。当switch的表达式的值与所有case都不匹配时,执行default后面的语句。
do:
用于创建一个do-while循环。do-while循环至少会执行一次循环体,然后根据while后面的条件判断是否继续执行。
enum:
用于创建枚举类型。枚举类型是一种用户定义的数据类型,用于定义一组命名的整数常量。
extern:
用于声明外部变量或函数,通常在一个文件中定义,在另一个文件中使用。extern关键字告诉编译器变量或函数是在其他文件中定义的。
static:
用于声明静态变量,使变量在整个程序执行期间保持存在。静态变量在函数调用之间保持它们的值。
struct:
用于定义结构体类型。结构体是一种用户定义的数据类型,用于组合不同类型的数据成员。
typedef:
用于为数据类型定义新的名称。typedef可以增强代码的可读性,并提供一种将数据类型命名为更具意义的名字的方式。
union:
用于定义联合类型。联合是一种数据结构,允许在相同的内存位置存储不同的数据类型。
volatile:
用于告诉编译器该变量的值可能会在未明确要求时被修改,因此编译器不应该进行优化。volatile关键字通常用于与硬件相关的变量,如硬件寄存器。
6、赋值(左值右值)
左值(lvalue):
- 左值是一个表达式或标识符,它指向内存中的位置,这个位置可以被修改。换句话说,左值是可寻址的。
- 左值可以出现在赋值语句的左边,因为它们代表着一个可以被赋值的位置。
右值(rvalue):
- 右值是一个表达式,它代表一个临时的、无法被修改的值,不可寻址。
- 右值不能出现在赋值语句的左边。
7、各类数值型数据间混合运算
运算结果类型由低级别向高级别转换
int i=100;
float j=1.23;
printf("%f \n", i+j);
输出:101.23
printf("%f \n", 3/5 +4.3);
输出:4.3