进制
廖家龙 用心听,不照做

C语言可以识别的进制:
1)二进制【C语言中如果要写二进制,就加一个0b的前缀】
2)八进制【加一个0前缀】
3)十进制
4)十六进制【加一个0x前缀】

%d:将整型变量中的数据以十进制的形式输出来
%o:将整型变量中的数据以八进制的形式输出来
%x:将整型变量中的数据以十六进制的形式输出来

数码:指的是这个数据的每一位数字
数位:数码在这个数中的位置,从右到左依次递增,从0开始
基数:就是进制
位权:数码*(基数的数位次方)

进制转换:

1)十进制转换为二进制(除2取余法):将这个数除以2,直到商为0,然后将余数倒序 【十进制转换为八进制/十六进制类似】

2)二进制转换为十进制(加权法):将这个二进制的每个数码的位权相加【八进制/十六进制转换为十进制类似】

3)二进制转换为八进制(三合一):将这个二进制从低位到高位每三个分成一组,高位不够补0,将每一组转换为十进制,将每一组的十进制连起来(二进制转换为十六进制类似)

4)八进制转换为二进制(一拆三)(十六进制转换为二进制类似)

5)八进制—>十六进制;八—>二—>十六

6)十六进制—>八进制:十六—>二—>八

内存中的数据存储单元是由一个一个的二进制位组成的,每一个二进制位只能存储0或者1;把内存中的八个二进制位分为一组,叫做一个字节,作为存储数据的最小基本单元

如果要往内存中存储数据的话,就至少要使用一个字节,这时候一个字节最多可以表示256种数据

1
2
3
4
5
6
单位换算:
1字节(byte)=8bit
1KB=1024byte
1MB=1024KB
1GB=1024MB
1TB=1024GB

我们在声明变量的时候,并不是去开辟一块空间,而是向系统在内存中申请一块指定字节数的连续的字节空间

char——1个字节
int——4个字节
float—4个字节
double—8个字节

sizeof:计算常量、变量在当前系统上内存中占用的字节数【sizeof(数据类型)、sizeof(变量名)、sizeof(常量) 】

char类型的变量在内存中占据一个字节,char类型的常量在内存中占据四个字节

变量在内存中占据的字节数,会因为系统版本、编译器的不同而发生变化

原码、反码、补码都是二进制,只不过是二进制的不同表现形式,数据是以补码的二进制存储的

int类型的变量,在内存中占据4个字节,32位,为了可以表示正负性,使用最高位来表示正负,最高位为0,表示正,最高位为1,表示负,所以用来表示数据的只有31位,2^31,最小值为-2147483648,最大值为2147483647

原码:最高位表示符号位,剩下的位数是这个数的绝对值的二进制

反码:正数的反码就是其原码,负数的反码就是在其原码的基础之上,符号位不变,其他位取反

补码:正数的补码就是其原码,负数的补码就是在其反码的基础上+1

为什么数据要以补码的形式存储呢?因为计算机中只有加法没有减法,为了更加低成本的计算出结果,所以使用补码来存储数据

位运算指的是一个二进制数据的每一位来参与运算,前提是这个数必须是一个二进制

注意:
1)参与位运算的二进制数据必须是补码形式
2)位运算的结果也是二进制的补码形式

1)按位与(&):参与按位与的两个二进制数,如果都为1,那么结果就为1,只要有一位为0,那么结果就为0【3 & 2 = 2】

任何数按位与1的结果是这个数的最低位,偶数的最低位一定是0,奇数的最低位一定是1,所以如果要判断这个数是奇数还是偶数,只要用这个数按位与1就可以了,如果结果为1,那么就是奇数,如果结果为0,那么就是偶数

2)按位或(|):参与按位或的二进制数据,只要有一位是1,那么结果就为1,只有当两位都是0的时候结果才为0

3)按位取反(~):单目运算符,将这个二进制数的每一位取反

4)按位异或(^):参与按位异或的二进制的位,相同为0,不同为1

交换两个变量的值可以用异或运算

5)按位左移(<<):参与按位左移运算的二进制数据,向左移动指定的位数,低位不够补0,高位溢出丢弃【左移运算有可能会改变其正负性;将一个数左移n位,相当于将这个数乘以2的n次方】

6)按位右移(>>):参与按位右移运算的二进制数据,向右移动指定的位数,低位溢出丢弃,高位补符号位【右移运算不会改变其正负性;将一个数右移n位,相当于将这个数除以2的n次方】

变量的存储:

变量占用的字节空间一定是连续的,内存中存储数据的最小基本单位是字节,每个字节都有一个独一无二的内存地址,是一个十六进制的数

在为变量分配字节空间的时候,是从高地址向低地址分配的

存储在变量中的数据是以数据的二进制补码形式存储进去的【低位存储在低字节,高位存储在高字节】

变量的地址:

是组成这个变量的低字节的地址,使用&取地址可以取出变量的地址

%p:取地址

声明变量就会占用内存空间,实际上程序在运行的时候,并不是说只有我们的代码才会声明变量,系统自己也会在内存中申请空间存储数据

short int:在内存中占据两个字节【最高位表示符号位,2^15,所以最小值:-32768,最大值:32767】【%hd来输出,%d可能会有问题】

long short:在32位系统下占4个字节,在64位占8个字节【%ld来输出】

long long int:在32位和64位下都占据8个字节【%lld来输出】

unsigned int,2^32,最高位不用来表示符号位了,所以最小值为0【%u来输出】

unsigned short int【%hu来输出】

字符数据在内存中存储的是这个字符所对应的ASCII码的二进制补码【实际上就是一个整数,可以用%d输出】

char变量是一个有符号的,最高位表示符号位

%c读取的时候,先从变量中读取出存储在变量中的整数,然后再去ASCII码表中去查找这个整数对应的字符,再显示这个字符