正数的补数(如何求正数的补数)
冯诺依曼系统结构
计算机处理的所有数据和指令都用二进制数表示。
在计算机运行期间,要执行的程序和要处理的数据首先存储在主存储器(内存)中。当计算机执行程序时,它会自动地、顺序地从主存中取出指令,并逐一执行。这个概念被称为顺序执行程序。
硬件由运算器、控制器、存储器、输入设备和输出设备组成。
数据的内置表示
二进制表示法
计算机中的数字必须用二进制数字串来表示,因为计算机中的符号和数字是一样的。因此,符号也必须用0和1来表示。以更高位0代表正,1代表负,这种符号数字化的内部表示称为“机数”,而机外用符号表示的对应数称为“真值”。将真值表显示为二进制字符串机器号的过程称为编码。
原码是符号位的绝对值加上真值,即之一位代表符号,其余位代表值。例如,如果是8位二进制:[+1]original = 000001[-1]original = 1000001,之一位是符号位。因为之一位是符号位,所以8位二进制数的取值范围是:【1111 111
反码的表达式是:正数的反码是其自身负数的反码。在其原始码的基础上,符号位不变,其余位反转。[+1]=[0000001]original =[0000001]inverse[-1]=[1000001]original =[1111110]
补数的表达是:正数的补数是负数的自身补数。在其原码的基础上,符号位不变,其余位反转,最后+1。(即在逆码+1的基础上)[+1]=[00000001]original =[0000001]inverse =[0000001]complement[-1]=[1000001]original =[1111110]inverse =[111111]
定点数和浮点数是小数点固定的数字。电脑里没有小数点专用的位,默认约定小数点的位置。一般固定在机器号更低位之后或符号位之后。前者叫定点纯整数,后者叫定点纯小数。定点表示简单直观,但数值表示范围太小,操作时容易溢出。
浮点数是小数点位置可以改变的数字。为了增加数值表示的范围,防止溢出,采用浮点数表示。浮点记数法类似于十进制中的科学记数法。
在计算机中,浮点数通常用顺序码和尾数表示,其中顺序码一般用补码定点整数表示,尾数一般用补码或原码定点小数表示。为了保证有效位不丢失,尾数进行了归一化处理,这是通常的科学记数法,即保证尾数的更高位为1,实际值用步长码进行调整。
符号表示指数的符号位,代码表示幂,符号表示尾数的符号位,尾数表示归一化的十进制值。
N =尾数×基数代码(指数)
位、字节、字
比特:“比特”是电子计算机中最小的数据单位。每个位的状态只能是0或1。
字节:八个二进制位构成一个“字节”,是存储空之间的基本计量单位。一个字节可以存储一个英文字母或者半个汉字,换句话说,一个汉字占用两个字节的存储空空间。
字:“字”由若干字节组成,一个字的位数称为字长。不同等级的机器字长不同。例如,在8位计算机中,一个字等于一个字节,字长为8位。如果是16位计算机,那么它的一个字由两个字节组成,字长是16位。计算机是数据处理和运算的单位。
字节顺序
字节顺序是指多于一种字节类型的数据在内存中的存储顺序。通常有两种字节顺序:小端和大端。
小端是指低字节数据存储在内存的低地址,高字节数据存储在内存的高地址;
大端意味着高字节数据存储在低地址,低字节数据存储在高地址。
基于X86平台的PC是字节序,而一些嵌入式平台是字节序。所有的 *** 协议也使用big endian来传输数据。所以有时候我们把大端法叫做 *** 字节序。
例如,数字0x12345678在两个不同字节顺序的CPU中的存储顺序如下:
BigEndian低地址高地址---------------------------------------------------->+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|12|34|56|78|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+LittleEndian低地址高地址---------------------------------------------------->+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|78|56|34|12|+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+从上面两张图可以看出,使用Big Endian存储数据是符合我们人类的思维习惯的。
union的存储顺序是所有成员从低位地址开始存储。通过使用这个特性,可以判断CPU是使用小端模式还是大端模式来读写内存。
示例代码如下:
uniontest{shorti;charstr[sizeof(short)];}tt;voidmain(){tt.i=0x0102;if(sizeof(short)==2){if(tt.str[0]==1&&tt.str[1]==2)printf("大端字节序");elseif(tt.str[0]=2&&tt.str[1]==1)printf("小端字节序");elseprintf("结果未知");}elseprintf("sizof(short)=%d,不等于2",sizeof(short));}字节对齐
现代计算机中,内存空是按字节划分的。理论上看起来,对任何类型变量的访问都可以从任何地址开始,但实际情况是,在访问特定类型的变量时,往往是在特定的内存地址进行访问,这就需要将所有类型的数据按照一定的规则排列在空中,而不是按顺序一个接一个地排出。这是对齐。
为什么要字节对齐?有些平台只能在某些地址访问某些类型的数据;根本原因是效率,字节对齐可以提高访问数据的速度。
比如有些平台总是从偶数地址读取数据。对于int变量,如果从偶数地址单元存储,只需要一个读周期就可以读取该变量,但如果从奇数地址单元存储,则需要两个读周期才能读取该变量。
字节对齐数据成员对齐规则原理:结构(或union)的数据成员,之一个数据成员放在偏移量0处,每个数据成员的起始位置要从成员大小的整数倍或成员的子大小开始(只要成员有子成员,如数组、结构等。)(比如32位计算机中int为4字节,应该从4的整数倍地址开始)。作为结构成员:如果一个结构中有一些结构成员,那么结构成员应该从里面更大元素大小的整数倍的地址开始存储。(struct b存储在struct a中,struct b中有char、int、double等元素,所以b要从8的整数倍开始存储。)收尾工作:结构的总sizeof,即Sizeof的结果,必须是其更大成员的整数倍,不足部分要补齐。
本文地址:百科常识频道 https://www.neebe.cn/changshi/930118.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!