C语言技术体系自学笔记(四)

1.6 进制

进制也是进制位,是人们规定的一种进位方法,。对于任何一种进制—X进制,表示某一位置上的数运算时,就是逢X进一位,十进制就是逢十进一,十六进制就是逢十六进一,二进制就是逢二进一。

十进制二进制八进制十六进制
0000
1111
21022
31133
410044
510155
611066
711177
81000108
91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F
16100002010

1.6.1 二进制

二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码表示的数。它的基数为2,进位规则是逢二进一,借位规则是借一当二。

当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。

术语含义
bit(比特)一个二进制代表一位,一个位只能表示0或1两种状态。数据传输是习惯以“位”(bit)为单位。
Byte(字节)一个字节为8个二进制,称为8位,计算机中存储的最小单位是字节。数据存储是习惯以“字节”(Byte)为单位。
WORD(双字节)2个字节,16位
DWORD两个WORD,4个字节,32位
1b1bit,1位
1B1Byte,1字节,8位
1k,1K1024
1M(1兆)1024k, 1024*1024
1G1024M
1T1024G
1Kb(千位)1024bit,1024位
1KB(千字节)1024Byte,1024字节
1Mb(兆位)1024Kb = 1024 * 1024bit
1MB(兆字节)1024KB = 1024 * 1024Byte

十进制转化二进制的方法:用十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。

28/2=14........0

14/2=7.........0

7/2=3...........1

3/2=1............1

1/2=0............1

28化为二进制为:11100

十进制的小数转换成二进制:小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果。

0.43*2=0.86...........0

0.86*2=1.72..........1

0.72*2=1.44..........1

0.44*2=0.88..........0

0.88*2=1.76..........1

0.43的二进制数为:0.11

1.6.2 八进制

八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。一些编程语言中常常以数字0开始表明该数字是八进制。

八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中。

二进制转八进制

101 101 101 100

  5      5     5     4

八进制转二进制

  7     4      6    2

111 100 110 010

十进制转化八进制的方法:

用十进制数除以8,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。

1.6.3 十六进制

十六进制(英文名称:Hexadecimal),同我们日常生活中的表示法不一样,它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9,A-F对应10-15。

十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位),因此常应用在计算机语言中。

二进制转十六进制:

0110 1011 1111

   6       b        f

十六进制转换为二进制:

   a         c     1       5

1010 1100 0001 0101

十进制转化十六进制的方法:

用十进制数除以16,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。

1.6.4 C 语言如何表示相应的进制数

十进制以正常数字1-9开头,如123
八进制以数字0开头,如0123
十六进制以0x开头,如0x123
二进制C语言不能直接书写二进制数
int a = 123;		//十进制方式赋值
int b = 0123;		//八进制方式赋值, 以数字0开头
int c = 0xABC;	//十六进制方式赋值
//如果在printf中输出一个十进制数那么用%d,八进制用%o,十六进制是%x
printf("十进制:%d\n",a );
printf("八进制:%o\n", b);	//%o,为字母o,不是数字
printf("十六进制:%x\n", c);

1.7 计算机内存数值存储方式

1.7.1 原码、反码、补码

1)原码

原码有如下特点:

最高位表示符号位,0表示正, 1表示负

其他数值部分就是数值本身绝对值的二进制数

负数的原码是在其绝对值的基础上,最高位变为1;

例如:以一个字节的大小描述

十进制数 15 原码 0000 1111

十进制数 -15 原码 1000 1111

原码表示法简单易懂,与带符号数本身转换方便,只要符号还原即可,但当两个正数相减或不同符号数相加时,必须比较两个数哪个绝对值大,才能决定谁减谁,才能确定结果是正还是负,所以原码不便于加减运算。

2)反码

对于正数:反码与原码一致

对于负数:符号位不变,其余位值变为相反数

例:以一个字节的大小描述

十进制数 15 原码 0000 1111 反码 0000 1111

十进制数 -15 原码 1000 1111 反码 1111 0000

3)补码

在计算机系统中,数值存储均是以补码形式存储。计算机中是不存在减法的

补码特点:

对于正数: 原码、反码、补码相同

对于负数:其补码在反码的基础上+1

对于负数:补码符号位不动,其余位求反,最后加1,得到原码

或补码-1,符号位不动,其余位取反,得到原码

例:以一个字节的大小描述

十进制数 15 原码 0000 1111 反码 0000 1111 补码 0000 1111

十进制数 -15 原码 1000 1111 反码 1111 0000 补码 1111 0001

以二进制方式计算如下式子(以一个字节大小计算):

9-6:

9 补码:0000 1001

-6 补码:1111 1010

9+(-6) 补码:10000 0011 一个字节为8位,最高位1在第九位溢出,舍去 得到

0000 0011换为原码:0000 0011 换为十进制表示 3

在计算机系统中,数值一律用补码来存储,主要原因是:

  1. 统一了零的编码

  2. 将符号位和其它位统一处理

  3. 将减法运算转变为加法运算

  4. 两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃

1.7.2 数值溢出

当超过一个数据类型能够存放最大的范围时,数值会溢出

有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。

例如 以char类型为例

char a=127;
char b=1;
printf("%d\n",a+b);//-128

a=127 补码为:0111 1111

b=1 补码为:0000 0001

a+b 补码为:1000 0000 原码:符号位不变,按位取反,最后末尾+1 得 1111 1111 +1 即为 -128

由此可是,一个数据类型的最大值加1,反而会因为溢出,得到此数据类型的 最小值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值