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 | 单位换算: |
我们在声明变量的时候,并不是去开辟一块空间,而是向系统在内存中申请一块指定字节数的连续的字节空间
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码表中去查找这个整数对应的字符,再显示这个字符