精华内容
下载资源
问答
  • 计算机存储

    2021-07-25 00:56:20
    计算机存储1、计算机存储单元计算机内有很多存储单元,计算机用这些存储单元存储数据,一个存储单元可以存储一个八位的二进制,一个存储单元又称作一个字节,记作1B。计算机的处理器一次可以处理的字节...

    计算机中数的存储

    1、计算机的存储单元

    计算机内有很多存储单元,计算机用这些存储单元存储数据,一个存储单元可以存储一个八位的二进制数,一个存储单元又称作一个字节,记作1B。计算机的处理器一次可以处理的字节数(存储单元数)称作该计算机的字长,按计算机的字长划分,微型计算机可分为8位机、16位机、32位机和64位机,现在的主流机型是64位机。即计算机中的处理器一次可以处理64位二进制数,也就是一次可以处理8个字节的二进制数。

    我们可以用一个存储单元来存储一个数据,也可以用多个存储单元联合起来存储一个精确度更高的数据,使用两个单元、四个单元、八个单元存储数据的方法与使用一个存储单元存储数据的方法完全相同,只是位数不同而已,使用多个存储单元存储数据时需将各单元连接起来使用,从而使存储的数据的数值范围更大。为了使叙述方便简洁,下面我们介绍用一个存储单元存储数据的方法。

    2、计算机中数值的存储

    在计算机中要存储有符号的数,则数值的正负号也只能用0和1表示。我们约定用八位中的最高位表示数的符号,比如我们要在存储单元中存储数值-35,首先要将35写成七位二进制数。35写成二进制数是100011B,不足七位,前面可以补0凑成七位,结果是0100011B。在最高位再添加1作为负号,于是-35在存储单元中存储的形式是:

    a4c26d1e5885305701be709a3d33442f.png

    同理,如果要存储正数35,则最高位应为0,结果如下图所示。

    a4c26d1e5885305701be709a3d33442f.png

    实际上在计算机中数有三种表示方法,分别是原码表示、反码表示和补码表示:

    1)数的原码表示法

    将一个数值写成二进制后再在符号位添加1或0作为符号,即为该数的原码,比如上面的10100011和00100011,就是-35和35两个数的原码,最左端的1或0均表示该数的符号。

    2)数的反码表示法

    正数的反码和原码相同,负数的反码是符号位为1,其余各位为原码的相反数,即原来为0的要写为1,原来为1的要写为0,比如35,其反码表示法仍和原码相同,即可表示为:

    a4c26d1e5885305701be709a3d33442f.png

    而-35的反码则应表示如下:

    a4c26d1e5885305701be709a3d33442f.png

    其中最高位的1表示负号,其余各位原来是1的变为0,原来是0的变为1

    3)补码表示法

    正数的补码表示法和和原码表示方法相同,负数的补码表示法是:符号位为1,其余各位为反码+1,比如35,其补码表示法仍和原码相同,即可表示为:

    a4c26d1e5885305701be709a3d33442f.png

    但-35的补码应表示为:

    a4c26d1e5885305701be709a3d33442f.png

    该结果显然是在上面的反码未位加了1后得到的。

    引入了反码和补码的概念后,计算机中数的运算可得到简化:

    实际上计算机中的数值是按补码存储的。下面就来说明这样存储数据的好处。

    4)计算机中数的加减运算

    【例题1】写出35和-1在计算机中的补码表示方法,并完成35-1的运算。

    由前面的例子已知35的八位补码是

    a4c26d1e5885305701be709a3d33442f.png

    补码是在反码的未位加1得到的数。

    下面完成35-1的运算,35-1的运算实际是两个数的补码相加的运算。将两个数补码直接相加,得00100010,参见下图。因为最高位是0,所以为正数,其后七位可直接转换为十进制数,转换后为34。这恰是正确的计算结果。

    a4c26d1e5885305701be709a3d33442f.png

    【例题2】完成-35-1的运算。

    由前面的例子已知-35和-1的八位补码分别是

    a4c26d1e5885305701be709a3d33442f.png

    由于计算结果的最高位是1,所以结果应为负数,最高位后的七位为负数的补码,还需求出原码,才能得到结果,由补码求原码的方法是再求补码(即再取反码并加1),下面由补码求原码(注意:不含符号位)。

    a4c26d1e5885305701be709a3d33442f.png

    上面的36即为由补码1011100求得的原码,再添加负号即为本题的结果。

    从上面的例子可以看出负数用补码表示后,二进制数的加法和减法得到了统一,即通过加法运算就可以解决减法的问题。

    我们上面求补码的过程虽然有些麻烦,但实际这一过程是由计算机自动完成的,计算机中用补码表示数的优越性至此一目了然。即加法和减法被统一成了同一种运算。

    5)计算机中整数的表示范围

    用原码表示时,用一个字节可以存储的有符号数

    最大的数是:01111111,最高位表示符号,其余七位转换为十进制数后为127,即27-1。

    最小的数是:11111111,最高位是符号,其余七位转换为十进制数后是127,即-127,

    即用原码表示的数的范围是-127至+127,其中0被表示了两次,00000000和10000000都表示数值0,这是这种表示方法的缺点之一。

    用补码表示时:

    最大值是正值,与用原码表示时相同,也是01111111,而最小值为10000000,对其中符号后的七位取反加1后得到128,即最小数是-128。用补码表示的数的范围是-128至+127,比原码表示的范围多1,因为原码中0被表示了两次。

    如果用计算机表示无符号数(将最高位也看作数值),则最大值是11111111,即255,最小数是00000000,即0,表示的数的范围是0至255。

    需要注意,计算机中数值计算时一定不要超过可以表示的数的范围,否则计算结果就会出现错误。

    6)

    计算机中的乘除运算

    计算机中的乘法运算可以通过左移位和加法来实现。

    【例题3】计算17X4

    首先将第一个数用八位二进制补码表示:

    17补码为:00010001

    将上面的数值左多两位,为01000100,转换为十进制后即为68.,这里通过两次左移即实现了二进制数的乘法运算。

    【例题4】计算17X5

    首先将第一个数用八位二进制补码表示:

    17补码为:00010001

    将该数左移两位,再和原数相加

    a4c26d1e5885305701be709a3d33442f.png

    转换为十进制数为85,即17乘以5等于85

    【例题5】计算-17X4

    首先将第一个数用八位二进制补码表示:

    -17补码为:11101111

    左移两位后为10111100,结果仍为负数,取反加1后求得原码为-68。

    有人可能会问如果向左移三位,最高位就变成0了,不就错了吗,是的,这时因为左移三位(相当于-17X8),其结果就超出8位数表示的范围了。我们讨论的的前提是计算结果不能超出8位二进制数表示的范围。在计算机中实际是使用32位甚至64位表示整数,当然其范围比此处讨论的数要大的多。

    从上面的例子不难看出,在计算机中只用向左移位和相加就可实现乘法运算。

    同理用向右移位和相减也能实现除法运算,只不过减法实际也是由加法实现的。

    通过前面的讨论可以得到结论,计算机中使用二进制数不仅容易实现,而且也容易简化计算过程,全部四则运算都可由加运算和移位运算来解决。实际上在高等数学中,任何复杂的单自变量函数都可以用四则运算来无限逼近(使用泰勒展开),实际上也就是说任何复杂的运算在计算机中都可由二进制的加运算和移位运算来实现。而二进制数的加法只需使用下面的三条规则就足够了:

    0+0=0

    0+1=1

    1+1=10

    实际上计算机中的数还有定点数和浮点数之分,前面讨论的数实际是假设小数点固定在一个字节的最右端,因此表示的是定点整数,如果我们认为小数点在一个字节的最左侧,则上面讨论的就是定点小数。我们也可以用另一种形式来表示数,比如数值“1234”可以写成0.1234乘以10的4次方,而数值23.546可以表示为0.23546乘以10的-2次方,这样我们就可以将一个数分为两部分来表示,一部分称为尾数,一部分称为指数。这样不仅能表示整数,而且也能表示小数,当然一个字节也需要分为两部分,比如用前面三位表示一个数的指数,后面五位表示一个数的尾数,这样表示的数的范围可以更大,这样表示的数我们称之为浮点数。

    展开全文
  • 符号数无符号数在计算机中怎么区分?计算机里面有符号数符号数字表示都是一样的,并且对于加法或者减法这些通用的操作都于两类数字都是一样的,并且intel32的处理器里面还有一个EFLAGS标志寄存器里面有两个...

    有符号数和无符号数在计算机中怎么区分?

    计算机里面有符号数和无符号数字表示都是一样的,并且对于加法或者减法这些通用的操作都于两类数字都是一样的,并且intel32的处理器里面还有一个EFLAGS标志寄存器里面有两个标志符CF用来表示无符号计算的溢出,OF用来表示有符号数的溢出。那么到底通过什么来表示一个操作是有符号的还是无符号的?

    作者:匿名用户

    链接:https://www.zhihu.com/question/22132187/answer/20401461

    来源:知乎

    著作权归作者所有,转载请联系作者获得授权。

    确如题主所说,计算机中存储的任何数据都是二进制形式,单看数据是无法认定其格式和内容的。

    计算机要用二进制编码来表达数值的符号,最直观的方法就是符号位。但为了保证基本算术运算在正负数上的一致性,x86计算机对负数采用了特殊的编码方式,即补码。

    为什么补码这么巧妙实现了正负数的加减运算?参见维基百科:

    http://zh.wikipedia.org/wiki/%E4%BA%8C%E8%A3%9C%E6%95%B8#.E4.BA.8C.E8.A1.A5.E6.95.B0.E7.9A.84.E5.B7.A5.E4.BD.9C.E5.8E.9F.E7.90.86

    下面结合题主提到的寄存器状态举个例子。为简化起见,我们8位二进制数来讲。

    先看8位二进制与无符号数和有符号数的对应

    二进制 无符号 有符号

    00000000 0 0

    00000001 1 1

    ...

    01111110 126 126

    01111111 127 127

    10000000 128 -128

    10000001 129 -127

    ...

    11111110 254 -2

    11111111 255 -1

    按照上述对应关系,我们可以把二进制运算解释为有符号或无符号的十进制运算。

    只有算术运算才会有正负号问题,而算术运算中最主要的就是加法系列指令和减法系列指令。范围内的运算咱们不关心,主要看看超出范围的运算如何处理。

    当运算超出范围后,CPU会改变标志寄存器中的值(置1),来表示当前的运算结果。算术运算主要用到的标志位如下。

    OV(溢出):运算结果超过数值表达范围(比如8位数运算超过256);

    ZR(零):运算结果为0时;

    PL(符号):运算结果的最高位为1。

    AC(辅助进位):低4位是否向高4位进/借位;

    CY(进位):高位进/借位;

    1. 当加法系指令的二进制结果大于11111111时会产生溢出,结果保留超过11111111的部分,并置溢出位为1。

    例如加法add指令:

    11111110+00000011=100000001=>00000001

    标志位:

    由于低4位和高4位都进位了,所以AC和CY置1

    对应的无符号运算:

    254+3=1

    对应的有符号运算:

    -2+3=1

    2. 减法系的指令会产生“减不过”的情况。减不过时cpu会给左数的最高位添加一个1,使得比右数大,再做减法并置溢出。

    例如减法sub指令:

    00000010-00000011=>100000010-00000011=11111111

    标志位:

    由于低4位和高4位都借位了,所以AC和CY置1,由于运算结果高位为1,PL置1

    对应的无符号运算:

    2-3=255

    对应的有符号运算:

    2-3=-1

    其他的算术运算较复杂,但都可以用类似的方法分析。因超出问题范围,此处不再赘述。

    展开全文
  • 在上一篇文章中,我们大致了解了一下有符号数无符号数的概念,接下来将通过几道题来加深对它们的了解! 题一:

    在上一篇文章中,我们大致了解了一下有符号数,无符号数的概念,接下来将通过几道题来加深对它们的了解!(这里使用vs2019编译器)

    题一:

    #include <stdio.h>
    int main()
    {
        char a= -1;
        signed char b=-1;
        unsigned char c=-1;
        printf("a=%d,b=%d,c=%d",a,b,c);
        return 0;
    }

    我们知道在vs2019编译器上 char 等同于 signed char ,并且有符号的 char 数据存储范围为:-128~127 ,所以上面这道代码,a , b的输出都为 -1 ,c 的话是一个无符号数,而它的范围却是 0 ~ 255 ,这时我们来详细分析一下(把 -1 存放到变量 c 中间,然后以 %d 的形式打印出来):

    首先 -1 的原,反,补:

    1000 0000 0000 0000 0000 0000 0000 0001 -原码

    1111 1111 1111 1111 1111 1111 1111 1110 -反码

    1111 1111 1111 1111 1111 1111 1111 1111 -补码

    然后存到 char 中发生截断:

    1111 1111 ——这时就是 unsigned char 中存储的二进制序列。

    最后以 %d(有符号十进制整数)打印:

    这里发生整形提升,由于是 unsigned char 所以高位补 0 :

    0000 0000 0000 0000 0000 0000 1111 1111——补码

    又因为这里高位为 0,是正数,所以原码,反码,补码相同,直接打印 1111 1111——255.

    程序运行结果图:

     题二:

    #include <stdio.h>
    int main()
    {
        char a = -128;
        printf("%u\n",a);
        return 0;
    }
    

    这个题,我们先把 -128 的原码写出来:

    1000 0000 0000 0000 0000 0000 1000 0000 ——原码

    1111 1111 1111 1111 1111 1111 0111 1111 ——  反码

    1111 1111 1111 1111 1111 1111 1000 0000 —— 补码

    然后存到变量 a 中,由于 a 的类型为 char,所以发生截断:

    1000 0000 —— 最后存到变量 a 中就是这串二进制序列。

    最后以 %u(无符号十进制数)打印:

    这里同样要发生整形提升:由于是 char 类型,并且最高位为 1—负数,所以左边补1,补到一个整形(int):

    1111 1111 1111 1111 1111 1111 1000 0000 —— 最后便是这个二进制序列

    由于无符号数打印,所以这里都是有效位,转换为十进制数为:

    4294967168

    程序运行结果图:

     题三:

    #include <stdio.h>
    int main()
    {
        char a = 128;
        printf("%u\n",a);
        return 0;
    }
    

    这个题可以看到与上个题只有一个正负号的分别,然后我们依旧分析:

    首先写出 128 的原码:

    0000 0000 0000 0000 0000 0000 1000 0000 —— 原码

    0111 1111 1111 1111 1111 1111 0111 1111 —— 反码

    0111 1111 1111 1111 1111 1111 1000 0000 ——补码

    然后放到 char a 中,发生截断:

    1000 0000 —— 与上一题一样的二进制序列

    再次发生整形提升,高位补符号位:

    1111 1111 1111 1111 1111 1111 1000 0000 —— 与上一题一样

    结果:

    4294967168

    截图:

     题四:

    #include<stdio.h>
    int main()
    {
       int i= -20;
       unsigned  int  j = 10;
       printf("%d\n", i+j); 
       return 0;
    }

    这个题是求两个数的加法,我们先来看在变量 i 和变量 j 中存放的数据:

    -20转换成二进制序列:

    1000 0000 0000 0000 0000 0000 0001 0100 —— 原码

    1111 1111 1111 1111 1111 1111 1110 1011 —— 反码

    1111 1111 1111 1111 1111 1111 1110 1100 —— 补码

    10转换成二进制序列:

    0000 0000 0000 0000 0000 0000 0000 1010 —— 原码,反码,补码(都相同)

    接下来由于这里不管是 int 或者 unsigned int 都是存放 4个字节的内容,所不会发生截断,后面的加法操作就是上面的补码相加:

    结果:

    1111 1111 1111 1111 1111 1111 1111 0110 —— 补码

    1111 1111 1111 1111 1111 1111 1111 0101 —— 反码

    1000 0000 0000 0000 0000 0000 0000 1010 ——原码(-10)

    程序运行结果如下:

     题五:

    #include<stdio.h>
    #include<windows.h>
    int main()
    {
        unsigned int i;
        for (i = 9; i >= 0; i--)
        {
            printf("%u\n", i);
            Sleep(1000); //每打印一个停一段时间
        }
        return 0;
    }
    

    这一题我们先来分析 i 是一个无符号整形变量,然后 for 循环从 9 开始,每次以 %u(无符号十进制整形) 的形式打印 i ,然后 i--,依次类推。

    首先 i 从 9 开始,由于 i 是一个无符号数,所以它的原码,反码,补码都是相同的,当 i 等于 0 它的补码:

    0000 0000 0000 0000 0000 0000 0000 0000 —— 0

    这时再减 1 的话,存储的就是 -1 的二进制序列:

    注意:在以前的文章中讲到在计算机中只有加法器,所以 0-1实际上就是 0 + (-1),而我们现在所说的有符号数,无符号数,对于计算机的算术运算都是没有影响的,因为在内存中都是存储的二进制序列补码。

    1000 0000 0000 0000 0000 0000 0000 0001 —— -1 的原码

    1111 1111 1111 1111 1111 1111 1111 1110 —— -1的反码

    1111 1111 1111 1111 1111 1111 1111 1111 —— -1的补码

    这时,因为是以 %u 打印,那么上面这串二进制序列每一位都是有效位 ,结果就是:

    4294967295

    然后判断,满足条件,继续 i-- ,最终是一个死循环的打印:

    程序运行结果图:

    题六:

    #include<stdio.h>
    int main()
    {
        char a[1000];
        int i;
        for(i=0; i<1000; i++)
       {
            a[i] = -1-i;
       }
        printf("%d",strlen(a));
        return 0;
    }

    先来分析一下,先定义了一个字符数组 a ,里面可以存放 1000 个元素,然后 for 循环把 -1-i 的值放到字符数组 a 所对应的下标 i 的那块空间中去,最后以 %d 形式打印 strlen(a)的返回值。

    首先,来看一下这个循环内部是怎样给 a 赋值的:

    当 i 为 0 时,a 中第一个元素为 -1 ,然后依次为 -2 ,-3 ... 直到 -128 ,因为我们知道一个 char 类型的内存空间为:-128 ~ 127,所以,这里-128在往后 -1:

    这里的-128是存放到 i 中的值,所以在内存中的二进制序列为 1000 0000

    这里算术运算时发生整形提升:

    1111 1111 1111 1111 1111 1111 1000 0000 —— -128整形提升后的二进制序列

    1111 1111 1111 1111 1111 1111 1111 1111 —— -1的补码

    -128 + (-1):

    0000 0000 0000 0000 0000 0000 0111 1111 —— 相加后的二进制序列

    然后放到一个char中,发生截断:

    0111 1111 —— 因为,为正数,所以原,反,补相同,就是127.

    接着依次类推 127 ,126 ,125,直到 0,这里注意,当 -1-i 的值为 0 的时候,字符数组后面的元素将不被 strlen 函数所统计,因为C语言规定字符串的结束标志为——'\0'(它的ASCII码就是0)。

    到这里,我们就会直到虽然里面放了 1000 个数据,但是真正统计的还是 255(128+127)个。

    程序运行结果图:

    题7:

    #include<stdio.h>
    
    unsigned char i = 0;
    int main()
    {
    	for (i = 0; i <= 255; i++)
    	{
    		printf("hello world\n");
    	//	printf("%u\n", i);    //用于查看i的值是不是总是大于等于0。
    	}
    
    	return 0;
    }

    先来分析:

    上面的代码,首先定义了一个 unsigned char 类型的全局变量 i 。然后循环一次,就打印一次

    hello world,当 i 小于等于 255 时,一直循环。(这里要知道 unsigned char 的范围:0~255)

    这段代码比较简单,中间就只有一个问题需要我们来仔细分析下:

    unsigned char 的 i 当循环到 255 时,再加 1 后,是什么数?

    当 i 等于 255 时,想要加 1 ,先发生整形提升:

    0000 0000 0000 0000 0000 0000 1111 1111 —— 255 的二进制序列(原,反,补相同)

    0000 0000 0000 0000 0000 0000 0000 0001 —— 1 的二进制序列(原,反,补相同)

    0000 0000 0000 0000 0000 0001 0000 0000 —— 相加后的结果

    存放到 unsigned char 中发生截断:

    0000 0000 —— 截断后的二进制序列(值为0)

    通过上面的内容,我们就知道当 i 为 255 时,加 1 后就又变成了 0 ,所以最终结果:

    死循环打印 hello world 。

    程序运行结果图:

    接下来就是详解浮点数在内存中的存储。

    我们知道在计算机中数据都是以二进制序列存储的,整形的数据我们都已经较为深刻了。那浮点数的二进制序列又是怎么写出来的了。

    首先,要了解浮点数的存储规则,也就是 IEEE 754 规定,任意一个二进制浮点数都可以表示成下面的形式:

    (-1)^S * M * 2^E

    S : 表示正负号,S 为 0 时,为正,S 为 1 时,为负。

    M :表示有效位,且 M 大于等于 1 ,且小于 2 (因为是二进制序列)。

    E :表示 2 的多少次方。

    举个例子:5.5

    写成二进制就是 —— 101.1

    写成IEEE 754标准 —— (-1)^ 0 * 1.011 * 2 ^ 2(二进制科学计数法)

    S = 0

    M = 1.011

    E = 2

    接下来就要存储到内存中,所以 IEEE 754 规定:

    对于32位的浮点数,最高的1位是符号位S,接着的8位是指数E,剩下的23位为有效数字M。

    对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。

    同时IEEE 754对有效数字M和指数E,还有一些特别规定:

    因为在计算机内部存储时这个数的第一位总是 1 ,所以在存储时就把小数点前面的 1 舍去,只存小数点后面的有效位,而当计算机拿出时,又会自动把 1 给补上。

    在存储指数E的时候,由于E是一个无符号数,但真实情况下E有可能是负数,所以IEEE 754 规定在存储E时,需要加上一个中间数( 32 位为 127 , 64 位为 1023 )。

    然后还有两个特例:当E全为 0 或全为 1 时:

    这时候M上有效位的 1 不会加上,表示 0.xxxxxxxx的小数,正负接近于0 或 正负接近无穷。

    接下来举个例子来说明上面的规定:

    #include<stdio.h>
    int main()
    {
    	int n = 9;
    	float* pFloat = (float*)&n;
    	printf("n的值为:%d\n", n);
    	printf("*pFloat的值为:%f\n", *pFloat);
    	*pFloat = 9.0;
    	printf("num的值为:%d\n", n);
    	printf("*pFloat的值为:%f\n", *pFloat);
    
    	return 0;
    }

    上面这段代码的输出结果是什么?

    分析:

    n为一个整形变量 ,存放的是 9 的二进制序列:

    0000 0000 0000 0000 0000 0000 0000 1001 —— 原,反,补

    然后用一个 float 类型的指针指向 n 。

    第一个 printf :

    可以看到是以 %d 的形式打印 n 中的值,所以输出为 9。

    第二个 printf :

    以 %f 的形式打印 *float ,所以这里是把 n 当成浮点数来打印,根据上面的规定:

    0 00000000  00000000000000000001001

    S : 0

    E :为全 0 ,所以真实值为 1-127(-126)

    M :E为全0时,M 的值取出时不加 1 ,直接以 0.xxxxxx的小数打印

    即: 0.00000000000000000001001 * 2 ^(-126)

    由于 %f 默认打印 6 位有效数字,所以这时打印 0.000000

    第三个 printf :

    在打印之前,先进行了这条语句:*float = 9.0;(把一个浮点数放到了float类型指针指向的空间)

    而打印又是以 %d 类型打印,整形变量 n 中的内容。

    先来讨论 9.0 存储的二进制序列:

    1001.0

    1.001 * 2 ^ 3(二进制科学计数法)

    S = 0

    E = 3

    M = 1.001

    所以存储的二进制序列:

    0 10000010 00100000000000000000000 —— 1091567616

    这时以 %d 形式打印整形变量 n 中的内容,将上面的二进制序列看成整形数据:

    0100 0001 0001 0000 0000 0000 0000 0000

    41 10 00 00(十六进制)

     正好,实际内存中也是存放的这一串十六进制序列,转换成十进制数为 1091567616 ,也与上面的值相符。

    第四个 printf :

    这个就很简单了,打印的就是 9.000000( %f 默认打印小数点后 6 位)

    程序运行结果图:

     

    好了,上面就是本篇文章的内容,有不足之处欢迎大家指出!

    展开全文
  • 定点计算机中采用的一种的表示方法。参与运算的的小数点位置固定不变。 定点的表示:

    在这里插入图片描述

    根据小数点的位数是否固定,在计算机中有两种固定格式:定点表示浮点表示

    定点数:计算机中采用的一种数的表示方法。参与运算的数的小数点位置固定不变。

    定点数的表示

    有符号数和无符号数的表示:
    在这里插入图片描述
    机器数的定点表示:
    在这里插入图片描述
    在这里插入图片描述
    原码补码反码移码
    在这里插入图片描述

    原码:
    最高位为符号位,0代表正数,1代表负数,非符号位为该数字绝对值的二进制表示。
    如:
    127的原码为0111 1111
    -127的原码为1111 1111

    反码:
    正数的反码与原码一致;
    负数的反码是对原码按位取反,只是最高位(符号位)不变。
    如:
    127的反码为0111 1111
    -127的反码为1000 0000

    补码:
    正数的补码与原码一致;
    负数的补码是该数的反码加1。

    如:
    127的补码为0111 1111
    -127的补码为1000 0001

    移码:
    不管正负数,只要将其补码的符号位取反即可。

    正数的原码、反码、补码是一致的;
    负数的补码是反码加1,反码是对原码按位取反,只是最高位(符号位)不变;
    计算机数字运算均是基于补码的。

    (本段来源网络)

    浮点数的表示

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    定点、浮点的区别
    在这里插入图片描述

    展开全文
  • 符号数的加减法1、符号数无符号数的人为规定性:一个数,是有符号数还是无符号数都是人为规定的。进行二进制运算时用无符号数或是补码运算时,结果都是正确的。10000100+00001110若规定为无符号数,即 132+146...
  • 符号数无符号数

    2021-05-18 07:37:49
    该楼层疑似违规已被系统折叠...讲解“有符号数”和“无符号数”之前,我们先来举一个例子。例如,有个人(称呼A)去爬山,半路上碰到朋友,朋友送了他一瓶水,此时A手上拥有一瓶水;那么,如果A觉得渴了,那他就把这...
  • 我们知道,C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数无符号数,因为在计算机里面都是0或者1,但是我们的实际使用中有时候需要...
  • 文章目录有符号数无符号数之间运算问题例子:问题探究:unsigned int变量跟int类型的变量运算时得出的结果是什么类型的?逐步思考:代码分析:问题总结例:1:例2: 符号和有符号两个数比较时,会默认转成无符号...
  • 1,整形:(默认有符号数内存中存的是其对应二进制补码 char(存在内存中是其ASCLL码) short(短整型) int(整形) long(长整形) 2,浮点型: float double long double(不是所有编译器都支持) 3,构造类型...
  • 0既不是正数也不是负数,而是正数和负数的分界点。因为0不是正数,2^8=256 从0-256刚好256个。...0不属于正数也不属于负数,所以有符号的情况下,储存的数字为-32768——+32767扩展资料:在计算机科...
  • 符号数处理

    2021-07-24 02:04:47
    在计算机内,定点数分为有符号数(signed)和无符号数(unsigned)。其中,有符号数的表示方法有三种:原码、反码和补码。反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。中文名...
  • 1Byte=8bit,二进制下,无符号整数取值范围是00000000-11111111,有符号取值范围是负1111111到正1111111,因为符号规则下,第一位0和1代表数字的正负,换成十进制就是无符号取值范围是0~255,有符号取值为-127.....
  • 1Byte=8bit,二进制下,无符号整数取值范围是00000000-11111111,有符号取值范围是负1111111到正1111111,因为符号规则下,第一位0和1代表数字的正负,换成十进制就是无符号取值范围是0~255,有符号取值为-127.....
  • C语言无符号数减法

    2021-05-17 11:33:15
    测试代码 void ChkTest...无符号数和有符号数进行算数运算,先转有符号为符号,然后运算(可能存在截断情况)。 3.负数实际内存中是以补码形式存在,%d格式输出的不是存储的原始数据,%x输出的才是内存原始数据。
  • 当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用1来表示“开”,0来表示“关”。 二进制的优点 数字装置简单可靠,所用元件少; ...
  • 必须掌握的知识点:1、数据宽度2、 理解有符号数无符号数3、进制的符号4、容器的种类在计算机的世界里,保存磁盘上的数据,无论是电影、还是音乐,还是可执行程序都是由0和1组成的,这些用磁盘保存的数据它可以...
  • 大学计算机基础1.4_计算机中带符号数的表示方法* 1.4 计算机中带符号数的表示方法 整数可以是正的或负的。 正整数是从0到正无穷,负整数是从负无穷到0。 为了高效地利用计算机存储空间,人们设计开发了两种使用...
  • 我是学过计算机原理的,也有有符号数无符号数的概念,以及正码、反码、补码的概念。可是我今天看C++primerplus时仍然对讲解的有符号数之间的跳变搞蒙了。原因是我只是有了概念,当初学习没有深入的去问为什么...
  • 不管是无符号数还是有符号数计算机运算时相应存储空间存放的都该数值的对应补码; 如上图: -100的补码是1001 1100,因为是无符号数,直接以补码形式输出为156 但是奇怪的事情发生了: 结论: 将运算结果...
  • 因为二进制只有“0”和“1”两个基本符号,而计算机是由逻辑电路组成,逻辑电路通常只有两个状态,开关的接通与断开,这两种状态正好可以用“1”和“0”表示。计算机中的数据是采用二进制表示的。计算机中的数据...
  • 计算机数据存储2

    2021-07-25 00:34:11
    1,位位是存储在计算机中的最小单位;它是0或1,位代表设备的某一状态,这些设备只能处于两种状态之一。例如,开关要么合上要么断开。用1表示合上状态,0表示断开状态。电子开关就表示一个位。换句话说,一个开关能...
  • 整数在计算机中是如何存储的? 无符号整数按其二进制的形式直接存储符号整数按其补码的形式存储 以8位二进制为例: 无符号整数存储范围:0~2^8 - 1 [0, 255] 有符号整数存储范围:-2^7 ~ 2^7 - 1 [-128, ...
  • 大学计算基础1.4_计算机中带符号数的表示方法* 1.4 计算机中带符号数的表示方法 整数可以是正的或负的。 正整数是从0到正无穷,负整数是从负无穷到0。 为了高效地利用计算机存储空间,人们设计开发了两种使用广泛...
  • 负数的二进制位表示法原码:一个整数按照绝对值的大小转换成的二进制,称为原码一个short 16位的整数9的原码是:0000 0000 0000 10011反码:一个二进制按位取反,所得的二进制成为原二进制的反码取9的二进制...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 175,915
精华内容 70,366
关键字:

无符号数在计算机的存储