一、进制转换
1.常见的进制
- 二进制:0、1,满2进1。
- 十进制:0 - 9,满10进1。
- 十六进制:0 - 9及A-F,满16进1。十六进制中,除了 0 到 9 十个数字外,还引入了字母,以便表示超过9的值。字母A对应十进制的10,字母B对应十进制的11,字母 C、D、E、F 分别对应十进制的 12、13、14、15。
- 八进制:0-7,逢八进一。
二进制 | 十进制 | 八进制 | 十六进制 |
0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 |
10 | 2 | 2 | 2 |
11 | 3 | 3 | 3 |
100 | 4 | 4 | 4 |
101 | 5 | 5 | 5 |
110 | 6 | 6 | 6 |
111 | 7 | 7 | 7 |
1000 | 8 | 10 | 8 |
1001 | 9 | 11 | 9 |
1010 | 10 | 12 | A |
1011 | 11 | 13 | B |
1100 | 12 | 14 | C |
1101 | 13 | 15 | D |
1110 | 14 | 16 | E |
1111 | 15 | 17 | F |
10000 | 16 | 20 | 10 |
10001 | 17 | 21 | 11 |
2.不同进制在C语言中使用规范。
二进制:0B或0b
十进制:正常数字
十六进制:0X或0x,A-F不区分大小写
八进制:0
代码示例:
#include <stdio.h>
int main()
{
int num,num1,num2,num3;
num=0b1110;//二进制
num1=12;//十进制
num2=020;//八进制
num3=0xf2;//十六进制
printf("%d %d %d %d",num,num1,num2,num3);//输出
return 0;
}
3.输出格式
不同的进制只是整数的书写方法不同,不会对整数的实际存储方式产生影响。不同进制可以混合使用,比如 10 + 015 + 0x20 是一个合法的表达式。
使用格式占位符可以将整数以不同进制形式输出,相关的格式占位符如下:
%d :十进制整数。
%x :十六进制整数。
%o:八进制整数。
%#x :显示前缀 0x 的十六进制整数。
%#X :显示前缀 0X 的十六进制整数。
%#o : 显示前缀的八进制整数。
代码例子:
#include <stdio.h>
int main()
{
int num,num1,num2,num3;
num=122;
num1=122;
num2=122;
num3=122;
printf("不带前缀的八进制整数:%o\n 带前缀的八进制整数:%#o\n 不带前缀的十六进制整数:%x\n 带前缀的十六进制整数:%#x ",num,num1,num2,num3);
return 0;
}
4.十进制与二进制之间的转换
(1)十进制转二进制
方法:辗转相除。
例如:126
除以2的商 | 取余 |
63 | 0 |
31 | 1 |
15 | 1 |
7 | 1 |
3 | 1 |
1 | 1 |
0 | 1 |
余数从下往上取:最终126转换为0B1111110
(2)二进制转十进制
从左边低位起,每一位的数字与2的n次幂的加和。(n是每一位的数位减一)
例如:0B11111110 0*2^0+1*2^1+1*2^2+1*2^3+1*2^4+1*2^5+1*2^6=2+4+8+16+32+64=126
5.十六进制与十进制之间的转换
(1)十六进制转十进制
规则:从最低位开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。
案例:请将0x34A转成十进制的数
10*16^0+4*16^1+3*16^2=10+64+768=842
(2)十进制转十六制
- 则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。
- 案例:请将356转成十六进制。
除以16的商 取余 22 4 1 6 0 1 356-->0x164
6.二进制与十六进制的转换
(1)二进制转十六进制
- 规则:低位开始,将二进制数每四位一组,转成对应的十六进制数即可。
- 案例:请将1011011转成十六进制。
0101-->5 1011-->11-->B
0B1011011-->0X5B
(2)十六进制转二进制
- 规则:将十六进制数每1位,转成对应的4位的一个二进制数即可。
- 案例:请将0x23B转成二进制。
2-->0010 3-->0011 B-->1011 0x23B-->0b1000111011
二、原码、反码、补码
计算机底层存储数据时使用的是二进制数字,但是计算机在存储一个数字时并不是直接存储该数字对应的二进制数字,而是存储该数字对应二进制数字的补码。
- 正数的原码、反码、补码都一样,三码合一。
- 负数的反码:它的原码符号位不变,其它位取反(0 -> 1,1 -> 0);负数的补码:它的反码+1。
- 0的反码、补码都是0.
例如:12 -12
12(三码合一) | -12 | |
原码 | 0000 1100 | 1000 1100 |
反码 | 0000 1100 | 1111 0011(原码取反) |
补码 | 0000 1100 | 1111 0100(反码+1) |
计算机内部的计算过程是用补码解决的。
三、数据类型
1.整型
(1)关于存储大小单位:
bit(位):计算机中的最小存储单位,表示一个二进制位。
byte(字节):计算机中基本存储单元,1byte = 8bit。
(2)注意事项:
- 类型存储大小受到操作系统、编译器、硬件平台的影响。
- 整型分为有符号signed和无符号unsigned两种,默认是signed。
- 开发中使用整型一般用int型,如果不足以表示大数,可以使用long long。
(3)字面量后缀:
int num = 123;
long num1 = 123L;
long long num2 = 123LL;
unsigned long num3 = 123UL;
unsigned long long num4 = 123ULL;
(4)格式占位符
- %d 对应 int 类型,%u 对应 unsigned int 类型。
- %hd 对应 short 类型,%hu 对应 unsigned short 类型。
- %ld 对应 long 类型,%lu 对应 unsigned long 类型。
- %lld 对应 long long 类型,%llu 对应 unsigned long long 类型。
代码演示:
#include <stdio.h>
int main()
{
// short 类型
short a1 = 10; // 等同于 signed short a1 = 10;
short a2 = -10; // 等同于 signed short a1 = -10;
// unsigned short a3 = -20;
unsigned short a3 = 20;
printf("a1=%d; a2=%d; a3=%d \n", a1, a2, a3); // a1=10; a2=-10; a3=20
// int 类型
int b1 = 100; // 等同于 signed int a1 = 100;
int b2 = -100; // 等同于 signed int a1 = -100;
unsigned int b3 = 200u;
unsigned b4 = 300U; // 等同于 unsigned int b4 = 300U;
printf("b1=%d; b2=%d; b3=%d; b4=%d \n", b1, b2, b3, b4); // b1=100; b2=-100; b3=200; b4=300
// long 类型
long c1 = 1000l; // 等同于 signed long c1 = 1000l;
long c2 = -1000L; // 等同于 signed long c2 = -1000L;
unsigned long c3 = 2000ul;
printf("c1=%ld; c2=%ld; c3=%ld \n", c1, c2, c3); // c1=100; c2=-1000; c3=2000
// long long 类型
long long d1 = 10000ll; // 等同于 signed long long d1 = 10000ll;
long long d2 = -10000LL; // 等同于 signed long long d2 = -10000LL;
unsigned long long d3 = 20000ULL;
printf("d1=%lld; d2=%lld; d3=%lld \n", d1, d2, d3); // d1=10000; d2=-10000; d3=20000
return 0;
}
输出结果:
a1=10; a2=-10; a3=20
b1=100; b2=-100; b3=200; b4=300
c1=100; c2=-1000; c3=2000
d1=10000; d2=-10000; d3=20000
2.浮点类型
(1)浮点数的类型
(2)浮点型注意事项
(3)字面量后缀
浮点数字面量默认double型,float num = 123f/123F,long double num1 = 123 L
(4)格式占位符
double类型的,输入必须是%lf,输出可以是%f,也可以是%lf.
float类型的,都是%f.
long double 类型输入输出必须是%LF.
%.2f表示输出值保留两位小数。
%e 对应科学计数法表示的浮点数,可以指定尾数部分所保留的小数位数,如 %.2e 表示尾数部分保留两位小数。
代码演示:
#include <stdio.h>
int main()
{
// double 类型
double a1 = 3.1415;
double a2 = .12345678;
double a3 = -2e12;
double a4 = 1.9823e2;
printf("a1=%f, a2=%.10f, a3=%.2lf, a4=%lf \n", a1, a2, a3, a4);
printf("a1=%e, a2=%.2e, a3=%e, a4=%e \n", a1, a2, a3, a4);
// float 类型
float b1 = 3.1415f;
float b2 = .123456f;
float b3 = -2e12f;
float b4 = 1.9823e2f;
printf("b1=%f, b2=%f, b3=%.0f, b4=%f \n", b1, b2, b3, b4);
printf("b1=%e, b2=%.2e, b3=%e, b4=%e \n\n", b1, b2, b3, b4);
return 0;
}
输出结果为:
a1=3.141500, a2=0.1234567800, a3=-2000000000000.00, a4=198.230000
a1=3.141500e+00, a2=1.23e-01, a3=-2.000000e+12, a4=1.982300e+02
b1=3.141500, b2=0.123456, b3=-1999999991808, b4=198.229996
b1=3.141500e+00, b2=1.23e-01, b3=-2.000000e+12, b4=1.982300e+02
3.字符类型
char类型,占1字节。表示单个字符,比如数字、字母、符号。
格式占位符:%c
字符的本质是数字。
常用转义字符:
ASCII(American Standard Code for Information Interchange)码是一种用于表示文本字符的字符编码标准,一共规定了128个字符的编码,只需要记住A对应的数字是65,a对应的数字是97,中间的数字都可推导。例如B是66,b是98.
代码演示:
4.布尔类型
布尔值用于表示真、假两种状态,通常用于逻辑运算和条件判断。
(1)声明布尔类型的三种方式
<1>C89标准没有定义布尔类型,判断真假时以0为假,非0为真 ,但这种做法不直观,我们一般需要借助C语言的宏定义。
条件为假,不输出条件语句。
<2>C99标准提供了_Bool 型,_Bool仍是整数类型,但与一般整型不同的是,_Bool变量只能赋值为0或1,非0的值都会被存储为1。
代码演示:
<3>C99标准还提供了一个头文件 <stdbool.h> 定义了bool代表_Bool,true代表1,false代表0。
代码演示:
四、今日小测
1.将十进制数 42 转换为二进制表示。
2.将二进制数 110110 转换为十进制表示。
3.将二进制数 1101 转换为十六进制表示。
4.将十六进制数 1A3 转换为二进制表示。
5.有十进制数-8,请用八位二进制小数表示的它的原码、反码、补码
6.请将下列数据类型按照所占字节多少从小到大排序
long long、char、int、short
7.【代码题】写出下面代码的运行结果
#include <stdio.h>
int main()
{
int a = 10;
_Bool b1 = -4;
printf("%d", a + b1);
return 0;
}
答案:
1. 101010
2. 54
3. D
4. 000110100011 或者 110100011
5. 原码:10001000 反码:11110111 补码:11111000
6.char(1字节)、short(2字节)、int(4字节)、long long(16字节)
7. 11 C99标准提供了_Bool 型,_Bool仍是整数类型,但与一般整型不同的是,_Bool变量只能赋值为0或1,非0的值都会被存储为1。