一.计算机中的进制
int a =18 计算机中默认是十进制数
二进制数: 以0b 或0B开头的数 int b = 0b10010
八进制数: 以0开头的数 int o = 022
十六进制数: 以0x或0X开头的数 int x = 0x12
格式输出符
十进制:%d 八进制:%o %D
十六进制: %x(a-f小写) %X(A-F大写)
在C语言中没有提供二进制的输出格式符
二.进制转换
1. 十进制转二进制: 除2取余倒序排
二进制转十进制: 每一位乘以对应位上的幂数然后相加
(从右向左,从0开始数,到第几位就乘以2的几次方然后相加)
0b10010 1*2(4)+1*2(1)=18
1024 512 256 128 64 32 16 8 4 2 1
2. 二进制转八进制:一个八进制就对应3个二进制,1个八进制最大表示7,3个二进制最大表示7
0b1,101 = 015
八进制转二进制:一个八进制位转换为3个二进制位
01,2,2 = 0b1010010
2. 二进制转16进制:一个十六进位对应4个二进制位,4个二进制数最大表示 15,一个十六进制位最大表示15
0b1111 = 8+4+2+1=0x15
0b1,0001,0010=ox112
16进制转二进制:一个十六进位对应4个二进制位
0xabc = 0b101010111100
3. 八进制转16进制== 八进制转换为二进制 → 二进制转换为十六进制
4. 十进制转十六进制:除以16取余倒序排
100 = 0x64
十六进制转十进制:每一位乘以对应位上的幂数然后相加
0x64 = 6*16(1) +4*16(0) =100
5. 十六进制转八进制== 十六进制转二进制 →二进制转八进制
6. 十进制转八进制:除以8取余倒序排
60/8 7 4
7/8 0 7
60= 074
八进制转十进制:每一位乘以对应位上的幂数然后相加
074 = 7*8(1)+4*8(0)=60
三.位运算符
1. & 按位与 对应的二进制位上,一个为0就是0,全1才是1
一假则假
2. | 按位或 对应的二进制位上,一个为1就是1,全0才是0
一真则真
3. ^ 按位异或 对应的二进制位上,不同为1,相同为0
规律:(1) 多个数相互异或,交换顺序结果不变(类似加法交换律)
(2) 任何数异或0都是原来的数
(3) 相同的数相互异或,结果为0
4. ~ 按位取反 对应的二进制位 0变1 1变0
负数= 正数取反+1 正数取反=负数-1
5. >> 右移 m>>n 向右移动n位
移出来的数删掉,移入位补符号位 (正数补0,负数补1)
使用场景:快速计算一个整数除以2的n次方,对于一个整数来说右移几次就是除以几次方
6. << 左移 m<<n 向左移动n位
移出来的数删掉,移入位补0 左移可能会改变符号位(正负性)
使用场景:当数比较小的时候,可以快速的计算这个数乘以2多少次方
四.变量的存储细节
计算机中最小的存储单元是字节,%p用来输出地址。
在函数内部定义的变量称为局部变量,系统在栈中为其开辟存储空间
自己的理解
1.当定义变量的时候,系统首先会分配大地址,所以先定义的变量的地址大于后定义的变量地址
2.变量的地址就是其所在存储空间的最小的地址
3.高位在高字节,地位在低字节
五.变量修饰符(针对64操作系统)
1. 修饰长度
int 4字节
short 2字节 %hd
long 8字节 %ld
long long 8字节 %lld
所有数据都是用来修饰int的 所以int可以省略
2.修饰符号
signed (所有数默认有符号,所以这个是废物)
unsigned 无符号的数 %u
只表示整数,不能表示负数,最高位不是符号而是数据位
unsigned int 4字节 %u
short 2字节 %hd %hu
long 8字节 %ld %lu
long long 8字节 %lld %llu
3.字符类型
1.字符 char 1字节
字符类型的本质是整形数
(1)当我们把一个字符复制给一个字符变量的时候,它首先去查ASCII码表,然后把值放到字符变量中
(2)当我们把一个字符按照%c格式输出的时候,它首先会去查ASCII码表,然后把对应的字符显示在控制台上,当我们表示一个较小的正整数,可以使用char 这样可以节省内存
六.代码练习
#include <stdio.h>
写一个函数以二进制形式打印十进制的数
void printBinary(int num)
{ // 计算变量num所在二进制位
int length = sizeof(num)*8
// 遍历二进制位
for(int i=0;i<length;i++){
int a = (num>>(length-1-i))&1;
printf("%d",a);
}
printf("\n");
}
int main(int argc, const char *argv[]{
/* 10
0000 0000 0000 0000 0000 0000 0000 1010
0000 0000 0000 0000 0000 0000 0000 0001 &
*/
printBinary(10);
return 0;
}
|
|