当前位置: 首页 > 科技观察

学C语言的人看,最全的十六进制转换,整数和十进制的内存存储模型

时间:2023-03-14 23:15:01 科技观察

什么是十六进制?对于任何一种系统---N系统,就是每N个进行每个位置的数字。相信大家都知道怎么算,比如012345678910111213。..数数的时候,当某位数到10时,就会向前移动。该系统称为十进制系统。然而,在日常生活中,并不只有这种基础系统。例如,一小时有60分钟,一分钟有60秒。当将完整的60向上舍入时,这就是六十进制系统。除了十进制,计算机中常用的基数还有二进制、八进制、十六进制。01234567规则:每八进制表示方法:八进制数520可以写成(520)8或520O十六进制组成:0123456789ABCDEF规则:每十进制十六进制表示:520在十六进制中可以写成(520)16或520H。为什么计算机中有这么多表示法?方便:二进制数中只有0和1两个数,可以用两个稳定状态不同的分量表示一个数位。简单:二进制数的运算简单,大大简化了运算中运算部分的结构,0+0=0、0+1=1、1+0=1、1+1=10。对与错:二进制与逻辑运算天生兼容。缺点:二进制计数在日常使用中有一个不便之处,就是位数往往很长,不方便读写。比如把十进制的100000D写成二进制就是11000011010100000B,所以我们在计算机领域其实是用十六进制的。当二进制数转换为十六进制数时,长度减少到原来的四分之一左右,十进制的100000写成八进制的303240。十六进制中的一位代表二进制中的四位。这样十进制的100000写成十六进制的186A0。存储单元就是我们平时使用的程序,如:Windows操作系统、打字软件、游戏软件等,一般安装在硬盘等外接存储上,但它的功能不能只用于此目的,它们必须调入内存运行才能真正使用其功能。因为内存的读写速度相对于外存是非常快的,但是内存是暂时存放程序和数据的地方。当我们使用WPS处理文档时,当你在键盘上敲出字符时,它是存储在内存中的。当您选择保存时,内存中的数据将被保存到硬盘(磁)盘中。存储器是由无数个晶体管(可以理解为灯泡)组成的,一个晶体管就是一个位的存储器。每个晶体管可以存储二进制0或1,也称为位。位:计算机存储的最小单位字节(byte):数据表示的最小单位一个字节通常是8位长1byte=8bit千字节(KB):1KB=1024byte为什么是1024而不是1000??2的10次方恰好是1024,原来是这么表示的~一个字节上面的换算单位是1024,只有一个字节等于八位不一样。。。思考:为什么硬盘上标的是容量与实际容量不同?容量不一样?我买的256G硬盘其实只有238.4G。我们一起换算:硬盘厂商十进制计算:256G=256,000MB=256,000,000KB=256,000,000,000Byte以1000为单位换算操作系统二进制计算:256G=262,144MB=268,435,456KB=274,877,906,944单位换算成1444单位的操作系统二进制计算:256G=262,144MB=268,435,456KB=274,877,906,944256G的实际容量为:256,000,000,000Byte/1024MB/1024MB/1024MB=238.4G所以,买一块256G的硬盘实际上只有238.4G,容量越大差距越大。十进制转其他进制的十六进制:短除以十进制数520为例,将其分别转为二进制、八进制和十六进制。以二进制、八进制、十六进制为例首先,你需要从右到左开始对其他的基数进行编号,012345...然后,通过这个公式[value*base^Number]计算传递每个数字的数字,然后将结果相加得到转换结果二进制1000001000转十进制9876543210数1000001000B1*2^9+0+1*2^3=512+0+8=520D八进制1010转十进制3210数1010O1*8^3+0+1*8^0=520+8=520D十六进制208转十进制210数208H2*16^2+0+8*16^0=2*256+8=520H八进制、十六进制和二进制转换:split八进制和二进制一个八进制数可以拆分成3个二进制数,3个二进制数可以合成一个八进制数//二进制转八进制001000001000B1010O//八进制转二进制1314520O001011001100101010000B十六进制和二进制一个八进制数可以拆分成4个二进制数,4个二进制数可以组合成一个八进制数//二进制转十六进制001000001000B208H//十六进制转二进制1314520H0001001100010100010100100000B为什么可以这样拆?三位二进制数表示的范围是[0-8)->2^3,用八进制刚好,四位二进制数表示的范围是[0-16)->2^4,恰好对于十六进制整数的存储方式是一个,机器号和机器号的真值为1,机器号是一个数在计算机中的二进制表示,称为机器号这个号码。机器号是有符号的,符号存放在计算机使用的机器号的最高位。正数为0,负数为1。比如十进制数+3,计算机字长为8位,转为二进制就是00000011,如果是-3就是10000011。那么,00000011和10000011这里是机器号。2、机器号的真值因为第一位是符号位,所以机器号的形式值不等于实际值。比如上面的有符号数10000011,最高位1代表负数,它的实际值为-3而不是形式上的131(10000011转十进制等于131)。因此,为了区别起见,将带符号位的机器号对应的实数值称为机器号的实数值。例:00000001的真值=+0000001=+1,10000001的真值=–0000001=–1二、原码、反码、补码我们先来了解一下原码、反码和补码概念。对于一个数字,计算机必须使用一定的编码方式来存储它。原码、反码、补码是机器存储特定数字的编码方式。1、原码原码是机器号,即第一位用来表示符号,其余位用来表示数值。例如:如果是8位二进制:[+1]original=00000001[-1]original=10000001第一位是符号位,因为第一位是符号位,所以取值范围8位二进制数为:(即第一位不表示数值,只表示正负。)[11111111,01111111],即[-127,127],原码为人脑最容易理解和计算的方法。2.反码一个正数的反码就是它自己;负数的反码以其原码为基础,符号位不变,其余位取反。[+1]=[00000001]原码=[00000001]反码[-1]=[10000001]原码=[11111110]反码可以看出如果一个负码代表一个负数,人脑无法直观地看到它的价值。一般是先转换成原码再计算。3、补码正数的补码就是它自己;负数的补码以其原码为基础,符号位不变,其余位取反,最后+1。(即在反码+1的基础上)[+1]=[00000001]original=[00000001]反=[00000001]complement[-1]=[10000001]original=[11111110]anti=[11111111]Complement对于负数,补码表示也是人脑无法直观看出其值的。通常还需要转换成原始代码然后计算其值。三、为什么要用原码、反码和补码?人脑可以知道第一位是符号位。在计算的时候,我们会根据符号位来选择加减真值区域。(真值的概念在本文开头)但是对于计算机来说,加减乘法已经是最基本的运算了,设计应该越简单越好。计算机对“符号位”的识别,显然会让计算机的基本电路设计变得非常复杂!于是人们想出了一个办法,就是用符号位来参与运算。我们知道减去一个正数等于加一个负数根据算法,即:1-1=1+(-1)=0,所以机器只能加不能减,这样计算机的设计操作更简单。我们以计算十进制表达式:1-1=0为例。先看原码:1-1=1+(-1)=[00000001]原码+[10000001]原码=[10000010]原码=-2如果用原码表示,让符号bit也参与计算,显然是做减法,结果不对。这就是为什么计算机不使用原始代码来表示数字的原因。为了解决原码相减的问题,出现了反码:1-1=1+(-1)=[00000001]原码+[10000001]原码=[00000001]反码+[11111110]inverse=[11111111]inverse=[10000000]original=-0发现用反码计算减法,结果的真值部分是正确的。唯一的问题实际上是“0”的特殊值。虽然人们理解+0和-0是一样的,但是0的符号是没有意义的,会有[00000000]原和[10000000]原两个码代表0。所以补码的出现解决了0的符号问题和0的两个编码问题:1-1=1+(-1)=[00000001]original+[10000001]original=[00000001]complement+[11111111]Complement=[100000000]补码=[00000000]补码=[00000000]注:进位1不计入计算机字长。这样0就用[00000000]表示了,之前出问题的-0就不存在了。而[10000000]可以用来表示-128:-128的由来如下:(-1)+(-127)=[10000001]原+[11111111]原=[11111111]补+[10000001]supplement=[10000000]-1-127补的结果应该是-128。在补码运算的结果中,[10000000]的补码是-128,但要注意,因为它实际上是使用-0的前一个补码。表示-128,所以-128没有原码和反码表示。(-128的补码是[10000000]的补码,计算出的原码是[00000000]元,是不正确的)使用补码不仅解决了0的符号和两次编码的问题,还可以表示一个最小值数字。这就是为什么8位二进制使用原码或补码取值范围是[-127,+127],使用补码取值范围是[-128,127]。整数的存储是把十进制的整数转换成它们对应的补码后存储的。小数的存储方式当今计算机对浮点数的存储遵循IEEE754/854标准,以二进制科学计数法存储在内存中。对于浮点数,计算机中存储的精度有两种,即单精度和双精度。单精度为32位,双精度为64位。符号S:0为正,1为负尾数M:指数小数点后的部分E:序号,表示小数点在数据中的位置为了使指数表示正负,一个偏差代码介绍,float为127,double1024十进制小数转二进制小数,先将整数部分转为二进制,再将小数部分转为二进制(小数部分乘以2,每次取出所得整数,和然后继续将剩余的小数部分乘以2,直到小数部分为零,或者直到达到要求的精度)以floatf=5.25为例整数部分:5->101小数部分:0.25->0.010.25*2=0.5---00.5*2=1.0---1FromValue从上到下:0.01最终结果:101.01=1.0101*2^2可以看出指数的实际值为2,加上偏差码127、2+127=129,129的二进制值为10000001B,所以不难get,8.25在内存中的存储情况是:如果这个值作为整数使用,将是一个非常大的数,就是1084751872。把这个内存中的值转换成十进制数很简单://1,先判断S所代表的正值负数+//2,计算E实际代表的指数10000001=129129-127=2//3,写出二进制小数形式1.0101*2^2=101.01//4根据M,以小数点开始作为二进制小数的界限No.210-1-2No.101.01B1*2^2+0+1*2^0+0*2^(-1)+1*2^(-2)=4+1+0.25=5.25注意:在二进制中,第一个有效位必须是“1”,所以这个“1”不会被存储。浮点数不能准确表示其范围内的所有数字。能精确表示的数并不是均匀分布的,越接近0越密集。