进制数:
二进制 八进制 十进制 十六进制
十进制: 逢10进1,每一位上的数字是0 ~ 9
二进制: 逢2进1,每一位上的数字是0、1
八进制: 逢8进1,每一位上的数字是0 ~ 7
十六进制: 逢16进1,每一位上数字0 ~ 9 a b c d e f
在数据前加前缀表示不用的进制数
十进制:不用加前缀,默认就是十进制
二进制: 0b或者0B 0b1010
八进制: 0 0121
十六进制:0x或者0X 0xa3
不同进制数有不同的输入和输出 | ||||
格式控制符 | short | int | long | long long |
十进制 | %hd | %d | %ld | %lld |
八进制 | %ho | %o | %lo | %llo |
十六进制 | %hx | %x | %lx | %llx |
二进制没有格式控制符
//定义一个变量,输入一个十六进制数,输出它对应的十进制的数据。
#include <stdio.h>
int main(void)
{
int a;
scanf("%x",&a);
printf("%d",a);
return 0;
}
//定义一个变量,输入一个字符,输出这个字符对应的ASCII码值,以及这个数值的八进制、十六进制形式。
#include <stdio.h>
int main(void)
{
char a;
scanf("%c",&a);
printf("这个字符的ASCII码值为:%d\n",a);
printf("这个字符的八进制为:%#o\n",a);
printf("这个字符的十六进制为:%#x\n",a);
return 0;
}
//在输出的%后加#是为了规范进制格式。
进制转换
十进制转二进制、八进制、十六进制
规则:
十进制的数 除以 要转换的进制,得到商后继续 除以 要转的进制,知道商为0,然后每一轮的余数逆序排列
二进制、八进制、十六进制转十进制
规则:
通过权重来计算(以下用例子说明)
十进制:
3 4 5 6
1000 100 10 1
10^3 10^2 10^1 10^0
计算可得:3*10^3+4*10^2+5*10^1+6*10^0=3456
二进制:
0b 1 1 0 1
2^3 2^2 2^1 2^0
计算可得:1*2^3+1*2^2+0*2^1=13
八进制:
0 1 4 1
8^2 8^1 8^0
计算可得: 1*8^2+4*8^1+1*8^0=97
十六进制:
0x 6 1
16^1 16^0
计算可得:6*16^1+1*16^0=97
二进制、八进制、十六进制之间的转换
规则:
1位八进制 == 3位二进制(421) 若是二进制转八进制则划分三位后编码
如 0243 ==》 0b010100011
如 0b | 001 | 111 | 101 | 100 ==》0 1754
1位十六进制 == 4位二进制(8421) 若是二进制转十六进制则划分四位后编码
如 0x3af ==》0b001110101111
如 0b | 0001 | 1111 | 1101 | 1100 ==》0x1fdc
16进制数: 0x0 ~ 0b00000000 0x1 ~ 0b00000001 0x2 ~ 0b00000010 0x3 ~ 0b00000011 0x4 ~ 0b00000100 0x5 ~ 0b00000101 0x6 ~ 0b00000110 0x7 ~ 0b00000111 0x8 ~ 0b00001000 0x9 ~ 0b00001001 0xa ~ 0x00001010 0xb ~ 0x00001011 0xc ~ 0x00001100 0xd ~ 0x00001101 0xe ~ 0x00001110 0xf ~ 0x00001111 | 8进制数: 0 ~ 7 00 ~ 000 01 ~ 001 02 ~ 010 03 ~ 011 04 ~ 100 05 ~ 101 06 ~ 110 07 ~ 111 |
十进制和二进制之间的快速转换
规则:
将所有的二进制权重罗列出来,然后勾选 + -
例子:
2024 --- 2进制 0 1
2048 1024 512 256 128 64 32 16 8 4 2 1
0 1 1 1 1 1 1 1 1 1 1 1
0 1 1 1 1 1 1 0 1 0 0 0 --- 2024
1500 --- 2进制
2048 1024 512 256 128 64 32 16 8 4 2 1
√ √ √ √ √ √ √
1 0 0 1 1 1 0 1 1 1 0 0
1024+256+128+64+16+8+4=1500
十六进制数据存储和字节的关系
一个十六进制数据 == 4位二进制
1个字节存储8位二进制
1个字节可以存储2个十六进制数据
例子:
int a = 0x12345678
以上是由于int共可开辟4个字节内存,而一个字节可以存储两个十六进制数据,则如上存储。