计算机基础进制转换及原码/反码/补码

进制转换

其他进制转换为十进制

为了跟程序中的进制表达一样,下面我用(0b,0,0x分别表示二进制,八进制,十六进制)
十进制 35
二进制 0b10101
八进制 0123
十六进制 0x110
在这里插入图片描述

十进制转换为二进制(除2倒取余)

除2即是将十进制的数除2,取余,所得商再除2取余,直到不能整除,最后将余数从下至上写出来

十进制转二进制

十进制转八进制

转换方法跟十进制转二进制一样,只是转八进制是除8求余
十进制转八进制

十进制转16进制

思路和前面两种进制转换相同
十进制转十六进制
由此可得各进制的取值:
二进制取值:0 1
八进制取值:0 1 2 3 4 5 6 7
十六进制:0 1 2 3 4 5 6 7 8 9 A B C D E F

上面都是整数的十进制转其它进制,接下来讲述带小数点

整数是除2取余,小数则是乘以对应进制数取整,直到达到要求的精度,顺序排列

十进制转二进制(小数)

具体做法:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。

以10.8来举例

在这里插入图片描述

十进制转八进制

与二进制计算方法相同!
在这里插入图片描述

十进制转16进制

在这里插入图片描述

二进制转八进制

将二进制数,从右往左,每3个数字分成一份,将每一份的二进制数转换为10进制,然后将十进制数拼起来就是结果

0b1100100			(编程中0b开始表明该数是二进制 )从右往左每三个组成一份
1 100 100		不够再最前面添0
001 100 100     最后用二进制转十进制方法挨个计算
 1   4   4      答案即是 0144  (编程语言中常常以数字0开始表明该数字是八进制,文章开头有提及)
二进制转十六进制

将二进制数,从右往左,每4个数字分成一份,将每一份的二进制数转换为十进制,然后将转换之后的10进制数拼起来就是结果

0b111010004个分成一组
 1110 1000     按二进制转十进制方法挨个计算
  e     8    答案即是0xe8  
  补充:十六进制中10 11 12 13 14 15分别表示为a b c d e f (字母不区分大小写)  

原码/反码/补码

计算机中处理数据最小单位:bit
在实际使用中最少使用8个bit来存放数据,也就是一个byte
计算机为了能存放负数,所以设计为:第一位为符号位
1:表示负数
0:表示整数

例如:10000001    ----->-1
	  00000001    ------->1

那么10000000与00000000相等嘛,按照数学理论来说,两者都是数值为0
但是计算机为了不用两个byte表示一个数字,所以将10000000设计值为-128
所以一个byte的取值范围:-128~127

计算机在存数字时,其实都是在存该数字对于的补码形式

原码:就是该数字本身的二进制形式
反码:
					正数的反码与该数字的原码形式一致
					负数的反码,符号位不变,其他为全部取反
1的反码:00000001
-1的反码:11111110
补码:
						正数的补码与该数字的原码形式一直
						负数的补码:该数字的反码+1;即对原码:符号位不变取反+1
1的补码:00000001
-1的补码:11111111

计算机底层存放补码,可以提高运算的效率,例如求1-1的值,其实就相当于1+(-1)
00000001
+
11111111
············
00000000

记住:计算机中存储的是补码形式,也就是说计算过后,也是补码

例如2-3=-1
2的原码:0000 0010 2的反码:0000 0010 2的补码:0000 0010
-3的原码:1000 0011 -3的反码:1111 1100 -3的补码:1111 1101
二者的补码相加结果:1111 1111 这个结果并不是计算错误,而是结果是补码形式.,又因为数值计算结果为负数,所以得再符号位不变,取反+1所以最后结果应该是:1000 0001 即-1

3-2 = 1
3的原码:0000 0011 3的反码:0000 0011 3的补码:0000 0011
-2的原码:1000 0010 -2的反码:1111 1101 -2的补码:1111 1110
二者补码相加结果:0000 0001。因为计算结果为整数,即符号位为0,原码的补码就是其本身。结果即为:0000 0001。

整数的类型转换

基本数据类型的相互转换:
小转大,自动转
大转小,强制转
自动转自然不会存在安全隐患,但是强制转存在,即如果转换之前的值大小超过了转换之后的类型的取值范围,计算机会将超出的数据直接去掉
例如:

//00000000 00000000 00000000 10000010
int i = 130;
//10000010 反码:10000001 原码:11111110
byte b = (byte)i
System.out.println(b);//-126

上述例子是声明了一个int类型的变量,值为130,因为int类型表示4个byte,即32位,所以i的原码为00000000 00000000 00000000 10000010,将i的值赋值给byte类型的b后,由于byte所能表达的数值范围:-128~127,即八位(包含了符号位)。所以计算机会将前24位去掉。此时b的补码即为:10000010.倒推为原码:11111110。即为-126

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值