精华内容
下载资源
问答
  • 也就是说计算机并不知道你存的是有符号数还是无符号数,而且所做的运算并不需要管你存的是什么数 王爽《汇编》是这样写的 00000001B,可以看作无符号数为1,有符号数为+1 1000000...

    计算机不能区分两者

    无符号数 没有原码,反码,补码等,他的范围是 ≥0 的
    有符号数 有原码,反码,补码等,他的范围是随意的

    计算机通常用补码来表示有符号数
    计算机的一个数据可以看作是有符号数,也可以看作无符号数的
    也就是说计算机并不知道你存的是有符号数还是无符号数,而且所做的运算并不需要管你存的是什么数


    王爽《汇编》是这样写的,下面是负数的时候为反码

    			00000001B,可以看作无符号数为1,有符号数为+1
    			10000001B,可以看作无符号数129,有符号数-127
    

    这两个数进行Add的时候

    			看作无符号数  1+129=130 (10000010B)
    			看作有符号数 +1-127=-126(10000010B)
    

    结果一致,不管我们如何看待,都已经包含两种含义


    展开全文
  • 有符号数无符号数区别

    千次阅读 2020-03-03 12:20:23
    在计算机中,数值类型分为整数型或实数型,其中整型又分为符类型或符类型,而实型则只有...若想要表示正负号,一般需要一个位来标记,如取最高代表正负号,则有符号无符号的数值最大值对比如下: 1 有符号:01...

    在计算机中,数值类型分为整数型或实数型,其中整型又分为无符类型或有符类型,而实型则只有符类型。 字符类型也分为有符和无符类型。在程序中,用户可以自己定义是否需要一个非负整数;
    用char来举例吧,char占一个字节,一个字节=8个二进制位,所以它可以表示2^8个数,也就是256个数。若想要表示正负号,一般需要一个位来标记,如取最高代表正负号,则有符号和无符号的数值最大值对比如下:

    1 有符号:0111 1111 = 2^6+2^5+2^4+2^3+2^2+2^1+2^0     = 127; ==> 范围是 -128 ~ 127
    2 
    3 无符号:1111 1111 = 2^7+2^6+2^5+2^4+2^3+2^2+2^1+2^0 = 255==> 范围是   0  ~ 255

    可以看出无符号数只有正数,没有负数,所以比如一个8位元可以储存的最大正数的个数是2的8次方也就是256.而有符号数,因为要兼容负数的可能性,就要牺牲一个位元来做符号表明.所以一个有符号数的最大正数的个数就是2的(8-1次方)再减掉1…是127.
    我们可以在程序中直观的看一下他们之间的区别:

    int main()
    {
     char c = 127;
     unsigned char u = 127;
     return 0;
    }

    结果如下:
    在这里插入图片描述当取值大于127时,再看程序:

    int main()
    {
     char c = 128;
     unsigned char u = 128;
     return 0;
    }

    在这里插入图片描述
    结果发生了变化,因为定义的c是有符号数,又因为c的表示范围是-128~127,所以当赋值c为128超过他的表示范围是,显示的值变为-128,有个小技巧,即128-256=-128,,若赋值-129,超过了其负数表示范围,就变成了-129+256=127,程序验证:

    int main()
    {
     char c = -129;
     unsigned char u = -129;
     return 0;
    }

    在这里插入图片描述
    还有一个问题就是溢出的问题,char是个8位的二进制数,若超过了八位,就只算其16进制的末尾的两位的大小。比如unsigned char的表示范围是0x00~0xFF,若表示0x8FF,则溢出,指标是后两位,即FF,8忽略掉,程序验证:

    int main()
    {
     char c = 0x8ff;
     unsigned char u = 0x8ff;
     return 0;
    }

    在这里插入图片描述

    展开全文
  • 有符号数无符号数区别

    千次阅读 2020-04-15 15:12:58
    C语言允许我们定义有符号数无符号数,例如一个字节的存储空间,我们可以定义成unsigned char,也可以定义成signedchar,但是你知道它们的区别吗?你知道它们是怎样被存储,又怎样被区分处理吗? 1.有符号数...

      C语言允许我们定义有符号数和无符号数,例如一个字节的存储空间,我们可以定义成unsigned char,也可以定义成signedchar,但是你知道它们的区别吗?你知道它们是怎样被存储,又怎样被区分处理吗?

    1.有符号数和无符号数的存储

      对于一个字节的存储单元unsigned char的范围为(0 - 255),它的存储方式就是把一个十进制的数转化为二进制的数保存起来,没什么说的。重点在于signed char的处理。

      对于一个字节的存储单元signed char的范围为(-128 - 127)。它的存储方式是“编译器以补码的形式存储”。举个例子,一个字节的存储空间存放了一个数据84h,有符号数存储为-124。

      我们再看这样两个定义“ unsigned char a=132”和“signed char  b=-124”。在调试模式下,可以看到a、b内存单元中的数据都是84h。

    结论:利用C语言定义的有符号数和无符号数,计算机本身是不能区分的,它所能做的就是存放一个二进制数据,如此而已。

    2.有符号数和无符号数的处理

      区分这些数据类型的工作是交给了编译器来完成;曾经那个编译器还未诞生的年代,这个工作就交给人来完成(猜想)。至于有符号数和无符号数的计算问题,因为指令是不会区分有符号或者无符号,所以这是需要编译器来通过编译出一系列指令完成有符号计算或者无符号计算。

    展开全文
  • 有符号数无符号数详解

    千次阅读 2020-05-10 13:47:41
    有符号数无符号数2.1 什么是无符号数 ?2.2 什么是有符号数 ?3. 原码、反码、补码3.1 背景3.2 原码、反码、补码3.2.1 什么是机器数?3.2.2 什么是真值?3.2.3 原码、反码、补码4. -1 和 0xFFFFFFFF问题参考 1. ...


    有符号数和无符号数详解(2)补码详解
    https://blog.csdn.net/lqy971966/article/details/106130830

    1. 通过例子看问题

    unsigned int uint;
    int i = -1;
    uint = i;
    printf("%x %u %d\n", uint, uint, uint);
    printf("%x %u %d\n", i, i, i);
    //输出
    	ffffffff 4294967295 -1
    	ffffffff 4294967295 -1
    /*
    	因为 根据打印格式打印的
    	%d 有符号32位整数
    	%u 无符号32位整数
    	%lld 有符号64位整数
    */
    uint = 0xffffffff;
    i = uint;
    printf("%x %d\n", uint, i);
    //输出ffffffff -1
    
    int j = -1;
    printf("%x\n", (~j));
    //输出0
    
    int k = 1;
    printf("%x\n", (~k);
    //输出0xfffffffe
    
    char c = 1;
    printf("%d\n", (~c));
    //输出-2
    
    因为: 
     char c = 1;
    printf("%x\n", c); //1
    printf("%x\n", (~c)); //fffffffe
    printf("%d\n", (~c));//-2
    

    如果以上例子看的没问题,那你就不用往下看了!哈哈~~

    2. 有符号数和无符号数

    2.1 什么是无符号数 ?

    无符号数(unsigned number) 是相对于有符号数而言的,
    指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。
    如: 32位操作系统中
    (普及概念:

    1. 8位的CPU,一次只能处理一个8位的“数据”或者一个8位的"指令"。比如’00001101’。

    2. 32位CPU一次能处理32位的数据或者一个32位的指令。
      如 00000001 00000011 00000111 00001111)

      unsigned int iMinNum = 0;
      unsigned int iMaxNum = 0xffffffff;
      printf(“iMinNum = %u, iMaxNum = %u\n”, iMinNum, iMaxNum);
      结果:
      –》iMinNum = 0, iMaxNum = 4294967295

    其中,无符号数32位的取值范围是: 0~4294967295
    注意:%u 无符号32位整数

    2.2 什么是有符号数 ?

    有符号数(signed number) 和无符号数基本相同,不同的是:一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示。
    如: 32位操作系统中

    int iMinNum = 0x80000000; //1000 0000 0000 0000 0000 0000 0000 0000 
    int iMaxNum = 0x7fffffff; //0111 1111 1111 1111 1111 1111 1111 1111
    printf("iMinNum = %d, iMaxNum = %d\n", iMinNum, iMaxNum);
    结果:
    iMinNum = -2147483648, iMaxNum = 2147483647
    

    其中,有符号数32位的取值范围是: -2147483648~2147483647
    二进制表示:
    最小值: 1000 0000 0000 0000 0000 0000 0000 0000
    最大值: 0111 1111 1111 1111 1111 1111 1111 1111
    因为: 在有符号数中,最高位所代表的值是- 2^ 31 ,而不是-1
    注意:%d 有符号32位整数

    2.3 有符号数和无符号数的区别

    1. 有符号数和无符号数的区别:
      在32位编译器中,有符号数的二进制位最高位表示-2^ 31,而无符号数的二进制位最高位表示的是2^31
    2. 无论它是有符号数还是无符号数,它的二进制表示肯定都是唯一的
      (不可能在有符号形式下有一种表示,在无符号形式下也有一种表示)

    3. 原码、反码、补码

    3.1 背景

    1. 负数表示问题
      在数学中,任意基数的负数都在最前面加上“−”符号来表示。
      在计算机硬件中,数字都以无符号的二进制形式表示。
      但是负数如何用二进制表示呢?
    2. 解决:
      当前通过:原码、反码、补码,用于扩展二进制数字系统,来表示有符号数。

    3.2 原码、反码、补码

    3.2.1 什么是机器数?

    机器数就是 数在计算机中的二进制表示形式。
    机器数是带符号的,在计算机中用二进制数的最高位存放符号, 正数为0, 负数为1。
    例如:

    1. 计算机字长为8位,则:
      十进制数+3 ,转换成二进制00000011,
      十进制数-3 ,转换成二进制10000011。
      那么,这里的00000011和10000011就是机器数。

    3.2.2 什么是真值?

    真值就是真正的值。
    因为二进制数的最高位是符号位,所以机器数的形式值就不等于真正的数值。
    为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
    即第一位用±表示数字的正负,其余为二进制数。
    例如:
    0000 0001的真值= +000 0001,1000 0001的真值= –000 0001。

    3.2.3 原码、反码、补码

    1. 原码:
      就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。

       例如:
       1 的源码 0000...0001
       -1的原码:1,000...0001
      
    2. 反码:
      正数的反码是其本身
      负数的反码是在其原码的基础上, 符号位不变,其余各个位取反

       例如:
       1的反码还是1
       如-1的补码为1,111...1110
      
    3. 补码:
      正数的补码就是其本身
      负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1

       例如:
       1的补码还是1
       -1的补码为1,111...111
       (这就解释了无符号-1 = 1111…1111 = 4294967295)
      

    因为: 在有符号数中,最高位所代表的值是- 2^ 31 ,而不是-1

    4. -1 和 0xFFFFFFFF问题

    上面的补码就解释了 -1 和 0xFFFFFFFF的问题
    有符号 -1 的二进制表示就是以补码形式表示,即: 0xffffffff ( =2 ^ 31 +2 ^ 30+…+2 ^ 1+2 ^ 0=- 2 ^ 31+2 ^ 31-1=-1)

    unsigned (-1)表示无符号整数的最大值 即: 4294967295(二进制全1)
    因此,unsigned(-1)=1,111…111(共32个1)。表示unsigned的最大值。
    也就是0xFFFFFFFF

    5. 计算机为什么采用补码来进行运算

    https://blog.csdn.net/m0_37955444/article/details/79848485

    有符号数和无符号数详解(2)补码详解
    https://blog.csdn.net/lqy971966/article/details/106130830

    参考

    https://blog.csdn.net/qq_28114615/article/details/85884280
    https://blog.csdn.net/weixin_38825407/article/details/86297969
    https://blog.csdn.net/weixin_40825228/article/details/81136554
    https://blog.csdn.net/baidu_33725271/article/details/69801949
    https://www.cnblogs.com/Wubg/p/5813595.html

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

    千次阅读 2018-10-10 11:57:37
    java中有符号数与无符号数互相转换 文章目录java中long类型转换成符号数java中符号数转换成符号数 java中long类型转换成符号数 由于JAVA中基本数据类型均为符号数,而且最大数据类型long为8字节 当long为...
  • Verilog 有符号数与无符号数运算

    千次阅读 2020-05-19 14:35:27
    无符号数运算,左值位宽不够,发生截断的现象 reg [3:0] a = 4'b1111;...2. 两个无符号数运算,赋值给一个符号的数。可以看出,右侧先按照无符号数进行运算,取得的运算结果按照左侧的符号进行.
  • 有符号数与无符号数的加减法

    万次阅读 多人点赞 2017-04-24 14:41:58
    1、符号数与无符号数的人为规定性:一个数是符号还是符号数都是人为规定的。进行二进制运算时用符号数或是补码运算时,结果都是正确的。10000100+00001110 若规定为符号数,即 132+146=146D 。若规定为...
  • 无符号数与有符号数比较大小

    千次阅读 2017-04-16 18:54:07
    申明: ...在此感谢博主!先出几个题目,再解释一下为什么答案是那样的。题目一:int a = -1; unsigned int b = 1;...结果输出: 1因为无符号数与有符号数比较时,要将符号数转化为符号数,再来比较。a 转化为
  • 有符号数无符号数理解

    万次阅读 多人点赞 2019-01-05 23:16:12
    大家都知道,在C/C++中,对于w位编译器,其有符号数表示的数值范围为-2 ^ (w-1)~2 ^(w-1)-1,无符号数...那么,有符号数无符号数区别在哪?同样都是以32位2进制位来表示(后文均以32位为准),为什么各自表示的...
  • 写在前面:计算机中数据存储运算的专业名词听起来晦涩,实际上我们在九年义务教育阶段就已经掌握了,如:整型(integer)——整数,浮点数(float)——小数,无符号数(unsigned)——正数,有符号数(signed)...
  • Verilog中的有符号数无符号数

    千次阅读 2019-10-03 19:41:44
    普通十进制数一律被认为是有符号数,如 32 //有符号数 -15 //有符号数 1 2 2、基数格式的表示法 基数格式表示情况下,数的符号要明确声明,如 8'sh51 //8位有符号数01010001 6'so72 //6位有符号数111010,即十进制...
  • verilog中有符号数无符号数在赋值、运算中的区别赋值有符号数的赋值和无符号数的赋值加减法运算两个无符号数的加减法运算两个有符号数的加减法运算有无符号数的混合加减法乘法运算无符号数/无符号数的乘法运算有无...
  • 首先,明确一个概念,什么是有符号数,什么是无符号数。以整型为例,int 类型的既可以表示正整数,又可以表示负整数,所以是有符号数。unsigned int 只可以表示正整数,所以成类似的数为无符号数。在计算机表示中,...
  • 有符号数无符号数之间的转换

    千次阅读 2019-07-16 16:34:43
    有符号数无符号数之间的转换 C语言运行各种不同的数据类型之间做强制类型转换,假设x为一个符号整型变量,通过(unsigned)x可以将一个符号整数转换为符号整数。 对于16位,在一台采用补码机器上,强制...
  • 有符号数与无符号数之间的转换

    千次阅读 2016-01-12 17:42:20
    1,C语音中负数怎么转换为补码形式 2,有符号数怎么转换为无符号数 3,无符号数怎么转换为有符号数
  •  看无符号数的最高位是否为1,如果不为1(为0),则有符号数就直接等于无符号数;如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。 以unsigned char和char为例子: 1.1将无符号数2转
  • 有符号数无符号数在一起进行运算时,要首先将有符号数转换为无符号数,再进行运算。 整型常量。 [cpp] view plain copy unsigned int n = 1024;  unsigned int m = 0XFF;  其中1024和oxff这...
  • 有符号数与无符号数比较-详解

    万次阅读 多人点赞 2017-06-23 10:08:46
    正如我们所知道的,编程语句都很多的基本数据类型,如char,inf,float等等,而在C和C++中还有一个特殊的类型就是无符号数,它由unsigned修饰,如unsigned int等。大家没想过,就是因为这些不同的类型,而使大家...
  • 有符号数无符号数的转换及思考

    万次阅读 多人点赞 2016-09-16 21:00:51
    1 有符号数无符号数的表示三者的最高位均为符号位.我以前一直没弄明白的是为何8位补码的表示范围是-128~127, 今天查阅了相关资料,于此记下。仍然以8位为例:原码原码的表示范围-127~-0, +0~+127, 共256个数字。正...
  • c/c++ 有符号数与无符号数的转换

    千次阅读 2015-11-25 09:43:08
    在开发中,经常会碰到有符号数与无符号数之间的转换,有时是隐性,有时是显性。如果不清楚其中规则,则可能带来非常难以排查的bug。
  • 无符号数有符号数的溢出判断

    万次阅读 多人点赞 2018-05-25 21:09:35
    无符号数溢出判断:其实很简单,就一句话: 当最高为向更高位进位(或借位)时产生溢出。就像这样: 有符号数溢出判断: 高潮来了: 最高位进位状态⊕次高位进位状态=1,则溢出怎么理解呢?首先要知道异或是...
  • 有符号数与无符号数比较大小

    千次阅读 2019-12-24 20:43:10
    今天练习时发现一个很...符号和符号两个数比较时,会默认转成无符号数,再进行比较。 当两个数都当作无符号数来进行比较时,-1的符号位当作数值位来进行比较,这将会是一个很大的数,所以本题的结果是大于!
  • 一、无符号数 1.高位溢出赋给一个位宽不够的数 wire [3:0] a=4'b1111;//15 wire [3:0] b=4'b0010;//2 wire [3:0] c; assign c = a + b;//17=10001 wire [3:0] a=4'b1111; wire [3:0] b=4'b0010; wire [2:0] c;...
  • 转 1、你自已决定是否需要正负: 就像我们必须决定某个量使用整数还是实数,使用多大的范围一样,我们必须自已决定某个量...在计算机中,可以区分正负的类型,称为符类型(signed),正负的类型(...
  • C语言中的自动类型转换: 在C语言中,进行混合运算时,编译系统遵循一定规则,完成数据类型的自动转换...所以,无符号数与有符号数进行运算时,先需要将符号数转化为符号数进行操作。以下代码所展示出的结果,...
  • 无符号数 有符号数 补码

    千次阅读 2018-10-16 22:43:34
    无符号数 有符号数 补码 本文是深入理解计算机系统这本书里面关于补码有符号数无符号数章节的一个摘要和读书报告,我个人认为这本书关于这一段的表述,要比绝大多数网上的博客甚至是国内教材要深入浅出的多.同时...
  • 有符号数与无符号数之间的运算

    千次阅读 2017-08-17 21:16:58
    在C/C++中,经常可能会涉及到一个无符号数与一个符号数之间的运算。其实这个问题是关于C/C++语言中的整数自动转换原则:当表达式中存在符号类型和符号类型时所有的操作数都自动转换为符号类型。因此,从这个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,122,247
精华内容 448,898
关键字:

有符号数与无符号数的区别