精华内容
下载资源
问答
  • 我们都知道在编程中数据类型是分为无符号与有符号,也就是所谓的正数与负数,现在以8位的unsigned char与char来说明有符号数与无符号数在计算机的存储。 unsigned char表示的数据的范围为[0-255] == [0-28-1] char...

    我们都知道在编程中数据类型是分为无符号与有符号,也就是所谓的正数与负数,现在以8位的unsigned char与char来说明有符号数与无符号数在计算机中的存储。
    unsigned char表示的数据的范围为[0-255] == [0-28-1]
    char表示的数据的范围为[-128,+127] == [-27-1,+27]
    unsigned char与char 都是8bit位的数字,在计算机中的存储单元是由0x00-0xFF来表示,其中这256个数字相同的部分为[0,+127] 存储单元为0x00-0x7F
    0x80-0xFF分情况,当数据类型为unsigned char时表示[128,255],当数据类型为char时表示[-128,-1],其他数据类型同理。

    展开全文
  • #0.计算机组底层电路只认识0和1,并没有...这里主要讨论无符号数和有符号数在计算机中是如何存储以及在VerilogHDL语言中如何使用。#2.VerilogHDL语言中除了integer类型之外所有数据类型默认都是无符号类型; ...

    #0.计算机组底层的电路只认识0和1,并没有任何数制和逻辑的概念。

    #1.首先在计算机中数字分为 定点数和浮点数; 定点数又分为定点整数和定点小数;定点整数有无符号和有符号两种 ;这里主要讨论无符号数和有符号数在计算机中是如何存储以及在VerilogHDL语言中如何使用。
    #2.VerilogHDL语言中除了integer类型之外的所有数据类型默认都是无符号类型;
    #3.符号扩展是用于两个运算操作数的位数不一样的时候,进行位数的统一的操作;这里只讨论相等位数;

     

    一,无符号数
    #如果要进行两个无符号数之间的大小比较该如何进行;首先应该注意的就是无符号数在计算机中是以原码形式存储的;原码存储就意味着这种表示方式下,任何计算结果都会是无符号数,这是因为1.存储位数是一定的所以最高位进位会被舍弃掉。2.如下图一样,所有加减的本质就是绕圈顺时针逆时针转。既然是这样,就是说直接用相减看差的方式是不可能得出正确的结果的;

    如:*这时候会想:因为Verilog中的数据默认是用无符号形式存储的,因此这个可以直接进行比较大小
    if(A - B > 0) C = 1;
    else C = 0;
    但实际上在无符号数中计算结果永远都是正的!所以这个不行*

     

    #所以真正真确的方式应该是从本质入手,也就是说两个数相减或相加,只要有溢出也就是最高位有进位那么结果一定是不对的,从这里入手在考虑实现细节。
    module comparator(
    input [3:0]A,
    input [3:0]B,
    output reg [3:0]C
    );

    reg [4:0]tempA;
    reg [4:0]tempB;
    reg [4:0]tempresult;
    always@()begin
    tempA = {0, A}; //对无符号数进行0扩展,实现标志位
    tempB = {0, B};
    tempresult = tempA - tempB;
    if(tempresult[4] == 0)begin
    C = 1; //被减数比较大
    end
    else if(tempresult[4] == 1)begin //这是有进位了,但是实际是被舍弃的
    C = 0; //减数比较大
    end

    end
    endmodule


    #BUT!在Verilog中已经有函数可以直接实现这种无符号数之间的转换;
    module comparator(
    input [3:0]A,
    input [3:0]B,
    output reg [3:0]C

    );

    always@()begin
    if($unsigned(A) > $unsigned(B)) C = 1; //刚才说过因为Verilog中的数默认是无符号数,因此可以这个函数也可以不写;;但是一定不能写成是相减的形式
    else C = 0;
    end

    endmodule

     

    二,有符号数
    #这里需要理解的是,有符号数有两种存储方式:原码形式和补码形式;但是几乎所有的计算机都使用二进制补码表示法来表示存储于n为存储单元的有符号整数。具体一些:假设4‘b1001是一个有符号数,用原码形式4’b1001=-1;但是用补码形式的话4'b1001=-7.在补码表示法中,对一个正数是直接用原码来表示,只有负数采用补码来表示,这是因为补码(~B+1)实际上是对负数取绝对值的运算,比如4‘b1001在补码下实际值为-7(还不理解就去查一下补码的表),对其进行取反加一就变成4'b0111=+7;*  (实际上有符号数的表示就是用补码来表示的,所以以后的所有情况都只考虑是在补码表示法下的用法)

    #这里在说明一下补码表示法下的运算,注意这里的“补码”是一种表示法!不是转换方式,具体来讲就是”正数不变,负数取反加一“;就这么简单。先看一下加法运算:如果4’b0110 + 4'b1001 就直接进行运算 = 4‘b1111;而实际上原式子用十进制写的话就是 6 + (-7) = -1;而4’b1111在补码表示下就是-1! 在看一下减法运算:如果4'b0110 - 4'b1001这时候就需要对被减数进行取反加一操作了,也就是对其加上绝对值~这是什么意思呢? 先看一下原式子的十进制表示:6 - (-7) = 6 + 7;所以实际上之所以要对被减数进行取反加一就是为了”负负得正“。接下来就很简单:4‘b0110 + 4'b0111 = 4'b1101; 会发现这时候计算结果4'b1101补码形式下等于-3,而正确应该是6+7 = 13;为什么呢? 对,是因为溢出了。因为4位有符号数的表示范围:0~7 -1~-8; 但是本质上应该可以理解了。


    这里不具体谈如何从最底层进行无符号数的大小比较,主要是因为Verilog中函数已经实现了具体的功能;这里又一些细节:

    对两个有符号数。必须考虑两个数是同号还是异号:
    A 、 对两个同符号数。因其相减不会溢出,即OF=0。 SF=0:被减数大于减数
    SF=1:被减数小于减数
    B 、如果比较的两个数符号不相同,此时就有可能出现溢出 ·若OF =0 (即无溢出),则有:
    如果被减数大于减数,SF =0,
    如果被减数小于减数,SF =1;
    如果被减数等于减数,sF =0,同时ZF =1;
    ·若OF =1(有溢出) .则:
    如果被减数大于减数,SF =1
    如果被减数小于减数,SF =0。
    若OF ⊕SF=0,则dest >src;
    若OF ⊕SF=1,则dest <src 。

    //比较两个有符号数的大小
    module comparator(
    input [3:0]A,
    input [3:0]B,
    input [3:0]C

    );

    always@()begin
    if($signed(A) > $signed(B)) C = 1; //同样这里不能写成减法的形式
    else C = 0;

    end
    endmodule

     

     

    所以这里需要记住的就是:

    有符号数的 (A > B) 和 (A-B>0)是不一样的,因为提供有符号类型的人已经帮你写好了如何进行比较的算法,所以用正确的方式去用,但是如果自己实现的话,就要考虑很多情况。

    转载于:https://www.cnblogs.com/haotianmichael/p/8024777.html

    展开全文
  • 有符号数第一位用来标识符号位,而无符号数只能表示正数。   区别:(以4位数表示)   有符号数0000 到0111(0到7) + 1000到1111(-8到-1) 在计算机中数是用补码来存储的,正数补码和原码一样,负数补码...

    有符号数的第一位用来标识符号位,而无符号数只能表示正数。

     

    区别:(以4位数表示)

     

    有符号数0000 到0111(0到7)   +    1000到1111(-8到-1)

    在计算机中数是用补码来存储的,正数的补码和原码一样,负数的补码等于符号位不变其他位取反再加1。当达到最大正数0111(7的补码),再加1时为1000(补码)。

    负数补码的绝对值是连符号位取反加1,然后看成无符号数,所以1000表示-8,1001表示-7。


    无符号数:0000到1111(0到15)


    展开全文
  • 确如题主所说,计算机存储的任何数据都是二进制形式,单看数据是无法认定其格式和内容计算机要用二进制编码来表达...先看8位二进制与无符号数和有符号数对应二进制 无符号 有符号 00000000 0 000000001 1 1

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

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

    为什么补码这么巧妙实现了正负数的加减运算?参见维基百科:
    补码
    -1的二进制表示

    下面结合题主提到的寄存器状态举个例子。
    为简化起见,我们8位二进制数来讲。
    先看8位二进制与无符号数和有符号数的对应二进制
    无符号 有符号
    00000000 0 000000001 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

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

    展开全文
  • 1.数在计算机存放形式 上过数电都知道,计算机存放数据分两种情况,即有符号存储和无符号存储。无符号存储是直接存储其二进制值,而有符号存储则是存储其补码。以8位为例,如存储无符号数12,则在计算机中...
  • 像上面赋值语句,整数-12345是如何存储在计算机中,并赋值给变量sx? 结论: 1、在赋值语句右边常量为字面常量,存储在常量区。 2、该字面常量为非负整数时,可以理解为:该字面常量以无符号数进行编码并...
  • [1]C语言中无符号数和有符号数之间运算 [2]负数在计算机中怎样存储 [3]二进制减法 1、负数如何在计算机存储? 原码:10进制转换成2进制是原码,只不过正数原码是本身符号位为0,负数原码符号位为1(以下...
  • 本文针对二进制数字是如何组成有意义数字,涉及到编码形式进行理解,主要集中三个概念:有符号数、无符号数、浮点数。虽然这些知识点可能实际工作当中真正派上用场场合并不多,但是对于计算机是如何联系...
  • 无符号数的减法

    千次阅读 2020-04-17 15:59:49
    存储在计算机数据是一定,所谓的无符号数,只是对于数据解读方式不一样,并不影响数据之间计算。而无符号数之间进行加减法运算,是通过补码来进行。比如a - b,实质上是a补 + (-b补)。 for example: ...
  • 对于有符号数,内存要区分符号位和数值位,对于人脑来说,很容易辨别,但是对于计算机来说,就要设计专门电路,这无疑增加了硬件复杂性,增加了计算时间。要是能把符号位和数值位等同起来,让它们一起参与运算...
  • 有符号数和无符号数

    2014-04-21 22:57:00
     一个数在计算机二进制表示形式, 叫做这个数机器数,机器数是以补码形式储存在计算机中。但是仅仅存储一个补码,计算机是怎么知道它存是一个正数还是一个负数呢?计算机用一个数最高位存放了它的符号,...
  • 关于有符号数和无符号数最近,在讨论有符号数和无符号数在计算机表示问题,结果越讨论越乱。而且使用C语言胡乱验证了一番,最后发现使用了C语言工具,竟然使得数据真正存储的事实更加令人迷惑。从一个侧面也...
  • 前面:计算机中数据存储与运算专业名词听起来晦涩,实际上我们九年义务教育阶段就已经掌握了,如:整型(integer)——整数,浮点数(float)——小数,无符号数(unsigned)——正数,有符号数(signed)...
  • 无符号数在计算机的存储较为简单, 因为没有符号位, 直接将数字化成二进制然后存储在对应的存储器或者寄存器中。 这时寄存器或者存储器的位数就可以表示数值的范围, 比如:如果是 8 位的, 表示的范围为 0 ~ ...
  • 计算机存储数字主要有三种方法:无符号表示法、符号加绝对值表示法、二进制补码表示法。  1.无符号表示法  无符号整数就是没有符号整数。它范围结余0到正无穷大之间。然而,由于计算机不可能表示这个...
  • 在计算机中由于受硬件限制,数据是有一定长度限制(称为数据宽度),超过最多宽度数据会被丢弃。 1. 常见数据宽度 位:里面只能存放一个值(0或1),计算机中最小存储单位 字节:一个字节有8个位 字:有16...
  • 学习了二进制数据,我们知道,在计算机系统中,存储的任何数据都是以二进制数据格式存储存储数据最小单位是字节(Byte),一个字节容量是八位(bit),可以存储8个二进制数据。在讲解“有符号数”和“...
  •  各种数据在计算机内部表示和存储形式称为机器。  特点: 采用二进制计数; 数的符号(正负)用“0、1”表示; 小数点隐含表示二不占位置。 机器数的真值  机器所对应实际数值。  机器数的...
  • 因为数据在计算机中都是以二进制0或1存储的,证书以0开头,负数以1开头,求反操作会把所有0改为1,所有1改成0,如果是有符号数,那么取反后,开头0会被改成1,开头1会被改成0,即正负有变化,但如果是...
  • 数的转换,主要以 C/C++ 为程序语言,学习无符号数与有符号数之间的转换、有符号数中不同数据类型的转换,不同字长之间的转换,在对程序结果有什么影响?数的存储主要学习数在计算机的存储方式。
  • 关于无符号数的原反补码以及整形提升

    千次阅读 热门讨论 2021-03-03 16:45:39
    十进制的数转化为二进制就是原码了,第一位是符号位(1是负、0是正),无符号数就是叫你别管第一位,原码除了符号位全部0变1、1变0就是反码了,反码+1就是补码了,而计算机的存储及运算都是按补码的,搞定。...
  • 在计算机中数值都是以二进制形式进行存储好计算。有符号数就是最高位1代表符号,最高位为1代表为负数,最高位为0代表正数。  原码:正数原码是其本身,负数原码是其绝对值加上符号位,例如8位二进制...
  • 一个数据在计算机存储是以01方式存储的,怎么表示有符号与无符号呢,很简单,数据类型最高位用于标识数据符号 最高位为1,表明这个为负数 最高位为0,表明这个为正数 //2-1.c #include <stdio.h> ...
  • 首先,要涉及到编码问题,需要了解到 原码 补码 反码 ...对于一个, 计算机要使用一定编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字编码方式. 1. 原码 原码就是符号位加上真值绝对值, 即用第
  • 数据通过编码规则转为在计算机存储的0和1 读取计算机内存储的0和1时,确定其解析类型,再根据对应编码规则进行解析 0x01 无符号数 存储的数据即真实数据 二进制 10011010 10进制 154 16进制 0x9A 0x02 有...
  • 在计算机中参与运算数有两大类:无符号数和有符号数。 无符号数 计算机中数均放在寄存器中,通常称寄存器位数为机器字长。 所谓无符号数,即没有符号数,在寄存器中每一位均可用来存放数值。当存放有...
  • 无符号数是相对于有符号数来说无符号数则没有符号位(即最高位为数值一部分),所有情况都为正数。 另外,对于无符号数运算没意义,因为运算(无符号)数值首位可能为1,这时就可能将其作为负数处理...
  • 所谓的无符号数即没有符号数,寄存器中每一位均可用来存放数值。而当存放有符号位时,则留出位置存放“符号”。因此,机器字长相同时,无符号数与有符号数所对应数值范围是不同。以机器字长16位为例子,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 523
精华内容 209
关键字:

无符号数在计算机的存储