当前位置: 首页 > Linux

现代计算机数字表示

时间:2023-04-06 03:33:14 Linux

现代计算机数字表示1概述现代计算机存储和处理以二进制信号表示的信息。二进制信号可以很容易地表示、存储和传输,例如电线上的高电压和低电压。存储二进制信号并对其进行计算的电子电路非常简单可靠,以至于制造商可以在单个硅芯片上封装数百万或数十亿个此类电路。对于数字,有三种重要的表示形式:无符号(unsigned)编码:对大于或等于零的整数进行编码补码编码:对有符号整数进行编码,包括正负浮点数(floating-point)编码:对实数进行编码,使用基于2的科学记数法。计算机表示使用有限的位数来对数字进行编码。因此,当数字太大而无法表示时,运算结果就会溢出。值得注意的是,整数的编码和浮点数的编码处理数字表示限制的方式不同:浮点数编码可以编码更大范围的值,但这种表示只是近似的,有整数与缺少精度。encoding虽然只能对小范围的值进行编码,但它是一种准确的表示,在有效范围内不会出现精度不足的情况。2信息存储计算机内存中的信息往往以二进制补码的形式存在。如何方便的使用内存中的信息,需要两条规则:信息的地址是什么?如何排列信息的字节?对于存储为连续字节的信息对象,对象的地址是使用的字节中的最低地址。2.1按字节顺序排列消息的字节有两个通用规则:大端(bigendian):消息的最高有效字节存储在高地址,最高有效字节存储在地址小端(litterendian):信息的低位字节存放在高地址,高位字节存放在低地址。例如,有一个整型变量intx=n,它的十六进制表示为0x12345678。那么内存就会为它分配四个字节的存储空间。假设地址值为0x100-0x103。那么0x100就是低地址,0x103就是高地址。字节的最高有效字节和最低有效字节的顺序从左到右递减。12是最高有效字节,依此类推,78是最低有效字节。对于大多数Intel兼容机,采用little-endian模式;IBM和Oracle的大部分机器都是big-endian模式;对于移动端,Andriod和IOS都是小端模式。2.2字符和字符串的表示2.2.1字符的表示在C或C++中,字符是用一定的标准代码来表示的。ASCII字符码是比较常用的,它用1个字节的位来编码字符。遗憾的是,ASCII编码只适用于英文文档,不支持一些特殊字符和中文编码。因此,UnicodeConsortium对支持多种语言编码的基本编码——Unicode统一字符集,进行了修订和修改,使用32位来表示字符。2.2.2字符串的表示在C或C++中,字符串被编码为以NULL('\0',值为0)结尾的字符数组。每个字符都由标准编码表示。2.3整数表示有两种不同的方法可以用位来表示整数。一是它只能表示非负整数;另一个是它可以表示负整数、零和正整数。无论哪种方式,它都以二进制补码形式存在于内存中。2.3.1无符号整数编码无符号数总是大于等于0,所以无符号数的补码就是它的二进制原码本身:unsignedintnum=10;//原码int型占32bit00000000000000000000000000001010//补码内存中存放的是补码00000000000000000000000000001010,无符号整数的所有位都是有效数字。2.3.2有符号整数编码对于有符号整数,将其转换为二进制后,最高(最左边)位代表符号位,不参与数据表示。其中0表示正数,1表示负数。对于补码:正数补码=正二进制原码负数补码=负二进制原码除符号位,其余位取反+1//无符号整数正数inta=3;//原码3。第一位是符号位,3是正数,所以是000000000000000000000000000000011//3的补码00000000000000000000000000000011//无符号整数符号数inta=-3;//-3的原码第一位是符号位,3是负数,所以是110000000000000000000000000000011//然后是反码,除了符号位,其余的位取反11111111111111111111111111111100//最后是补码:1的补码+1,也就是负3在内存中的形式111111111111111111111111111111012.4实数在计算机中的表示形式,并且实数的表示不同于整数的表示。实数的二进制组成有符号位、指数码位和尾数位三部分。不用说,最高有效位是符号位。在第二个最高有效位之后是命令代码位,其长度取决于精度范围。单精度浮点型的精度只有8位;双精度浮点型有11位顺序码位。在指数之后,余数是尾数。比如有一个单精度浮点数据9.65,在内存中转换为二进制表示。其中,float占用4个字节。那是32位。所以(后面的顺序是从右到左):符号位:占1位,31阶码:从第二位开始,占8位。第23~30位尾数:尾数在指数码结束后,占23位,位数为0~22。下面开始转换:9.65是正数,所以符号位为0来确定序号,先把9.65转换成二进制表示:(1001.10100110011001100110)b;然后转换为二进制指数表示:(1.00110100110011001100110*103)b;指数代码=指数部分+127,指数代码=3+127=130,用八位二进制数表示(10000010)b。步骤2中取小数部分转换为二进制指数形式作为尾数00110100110011001100110,不足23位的用0补低位。因此,完整的数据为:(01000001000110100110011001100110)b.这种组合只是为了清楚地看到每个部分的组成。根据一组4个二进制数(01000001000110100110011001100110)b,用十六进制表示:(411A6666)hex。如果用工具查看内存,big-endian方式为(411A6666),little-endian方式为:(66661A41)。大多数计算机都是小端,下面是在小端方式代表的电脑上运行的结果。