精华内容
下载资源
问答
  • 像u一样的符号
    万次阅读 多人点赞
    2020-05-10 13:47:41


    有符号数和无符号数详解(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

    更多相关内容
  • C语言无符号数赋值为负数时的%d%u输出问题解释

    千次阅读 多人点赞 2020-01-14 00:42:50
    文章目录问题发现什么是无符号整形补码的计算无符号整形的输出正确时:错误时:问题解决int用%d和%u输出unsigned int用%d和%u输出 问题发现 近日在练习过程中发现无符号整形数如果赋值为“-1”可以用%d进行输出,...

    问题发现

    近日在练习过程中发现无符号整形数如果赋值为“-1”可以用%d进行输出,从而得到问题
    代码如下

    #include<stdio.h>
    int main()
    {
    	unsigned int e = -1;  //输出结果是-1,说明这里无符号整形也能储存-1,问题不明 
    	printf("unsigned int=%d\n",e);
    	return 0;
     } 
    

    结果如下:

    unsigned int=-1
    

    什么是无符号整形

    在书中说明整形为 int 无符号整形为 unsigned int
    int在储存数据空间中最高位代表数据的正负(0为正,1为负)
    unsigned int 在储存中所有数据空间皆为数据值,但只能存放正数。
    所以可以存放的正数范围比整形变量大一倍

    例如int空间为4个字节,所以unsigned int 也为4个字节,但第一位可以表示数据而不是符号。则有以下补码:

    int a =1:

    00000000000000000000000000000001

    int b =-1:

    10000000000000000000000000000001

    最大值int max = 2147483647 (231-1)

    01111111111111111111111111111111

    最大值unsigned int Max = ‭4294967295‬ (232-1)

    11111111111111111111111111111111

    补码的计算

    正整数的补码是其二进制表示,与原码相同

    例:+9的补码是00001001。(备注:这个+9的补码是用8位2进制来表示的,补码表示方式很多,还有16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。)

    求负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1 。
    同一个数字在不同的补码表示形式中是不同的。
    比如-15的补码,在8位二进制中是11110001,然而在16位二进制补码表示中,就是1111111111110001。以下都使用8位2进制来表示。

    例:求-5的补码。
    -5对应正数5(00000101)→所有位取反(11111010)→加1(11111011)
    所以-5的补码是11111011。

    无符号整形的输出

    无符号整形在输出时要用%u格式来进行输出(十进制无符号数),若赋值为负值则会输出错误(如int类型负数)

    例如:

    正确时:

    	unsigned int a = 30;
    	printf("unsigned int=%u\n",a);
    

    输出为

    	30
    

    错误时:

    	unsigned int a = -30;
    	printf("unsigned int=%u\n",a);
    

    输出为

    	4294967266
    

    问题解决

    int用%d和%u输出

    在查阅资料后发现,C中%d与%u的区别是程序如何去解释这一变量的数据
    所以,%d在解释过程中第一位数据代表了符号,%u第一位数据代表了数据值
    在输出一下数据时就有:

    int a = -1;
    printf("%d\n%u",a);
    
    -1
    4294967295
    

    因为-1的补码为

    11111111111111111111111111111111

    %d解释过程:

    1.第一位是1,所以为负值。
    2.由补码再求补码,得到以下补码

    10000000000000000000000000000001

    3.输出结果 -1

    %u解释过程:
    直接将其按源码处理,所以值为232-1 = 4294967295

    unsigned int用%d和%u输出

    经过上面的讨论,有如下代码

    unsigned int a = -1;
    printf("%d\n%u",a);
    

    输出为

    -1
    4294967295
    

    同理,在赋值时,-1的源码被转换为补码:

    11111111111111111111111111111111

    所以在赋值到unsigned int 中时也是相同的,所以在经过%d%u解释后输出的值仍为-1 和 4294967295。其他负数值同理。

    展开全文
  • word 符号栏无法使用

    2014-09-18 19:41:08
    word2003符号栏无法使用的解决方法,特殊符合也一样适应,你试试看, 1.按[开始]菜单上的[运行],输入cmd,按[确定] 2.输入cd C:\program files\microsoft Office\office11\addins 完成后按[enter]键 3.输入regsvr32 /u ...
  • 如何看懂常用原理图符号、如何阅读原理图

    万次阅读 多人点赞 2019-04-30 18:19:05
    1、原理图符号(第1部分) 1.1、电阻器 1.2、电位计和可变电阻器 1.3、电容器 1.4、电感器 1.5、开关 1.6、电源 1.6.1、直流或交流电压源 1.6.2、电池 1.6.3、电压节点 2、原理图符号(第2部分) 2.1、...

    目录

    1、原理图符号(第1部分)

    1.1、电阻器

    1.2、电位计和可变电阻器

    1.3、电容器

    1.4、电感器

    1.5、开关

    1.6、电源

    1.6.1、直流或交流电压源

    1.6.2、电池

    1.6.3、电压节点

    2、原理图符号(第2部分)

    2.1、二极管

     2.2、晶体管

    2.2.1、双极结晶体管(BJT)

    2.2.2、金属氧化物场效应晶体管(MOSFET)

    2.3、数字逻辑门

    2.4、集成电路

    2.5、杂记

    2.5.1、晶体和谐振器

    2.5.2、接头和连接器

    2.5.3、电机,变压器,扬声器和继电器

    2.5.4、保险丝和PTC

    3、阅读原理图

    3.1、网络,节点和标签

    3.2、交汇点和节点

    3.3、网络名称

    3.4、原理图阅读技巧

    3.4.1、识别模块

    3.4.2、识别电压节点

    3.5、参考组件数据表


    原理图是我们设计,构建和排除电路故障的地图。了解如何阅读和遵循原理图是任何电子工程师的重要技能。

    我们在下边将介绍常用的原理图符号:

    然后我们将讨论这些符号如何在原理图上连接以创建电路模型,并提出一些建议和技巧。

    1、原理图符号(第1部分)

    以下是各种组件的一些标准化基本原理图符:

    1.1、电阻器

    原理图上的电阻器通常由几条锯齿线表示,两个端子向外延伸。使用国际符号的原理图可以改为使用无特征的矩形,而不是曲线。

    1.2、电位计和可变电阻器

    可变电阻器和电位器各自用箭头增加标准电阻器符号。可变电阻器仍然是一个双端子器件,因此箭头恰好位于中间对角线。电位计是三端子设备,因此箭头成为第三个端子。

    1.3、电容器

    有两种常用的电容符号。一个符号表示极化(通常是电解或钽)电容器,另一个符号表示非极化电容器。通常,有两个端子,垂直地延伸到板中。

    带有一个弯曲板的符号表示电容器是有极性的。弯曲板代表电容器的阴极,其电压应低于正极引脚,加号也可以添加到极化电容符号的正极引脚。

    1.4、电感器

    电感器通常由一系列弯曲凸起或环形线圈表示。国际符号可以仅将电感器定义为填充矩形。

     

    1.5、开关

    开关以许多不同的形式存在。最基本的开关,单刀单掷(SPST),是两个端子,半连接线代表执行器(将端子连接在一起的部分)。

    具有多个投掷的开关,如下面的SPDT和SP3T,为执行器增加了更多的可接触点。

     具有多个极的开关通常具有多个相似的开关,其中虚线与中间致动器相交。

    1.6、电源

    正如有很多选项可以为您的项目供电,有各种各样的电源电路符号可以帮助指定电源。

    1.6.1、直流或交流电压源

    大多数情况下,使用电子设备时,您将使用恒定电压源。我们可以使用这两个符号中的任何一个来定义源是提供直流电(DC)还是提供交流电(AC):

    1.6.2、电池

    电池,无论是圆柱形,碱性AA还是可充电锂聚合物,通常看起来像一对不成比例的平行线:

    更多线对通常表示电池中有更多串联电池。此外,较长的线通常用于表示正端子,而较短的线连接到负端子。

    1.6.3、电压节点

    有时-特别是在非常繁忙的原理图上-您可以为节点电压分配特殊符号。您可以将器件连接到这些单端符号,它将直接连接到5V,3.3V,VCC或GND(地)。正电压节点通常用向上的箭头表示,而接地节点通常包括一到三条扁平线(或者有时是一个向下的箭头或三角形)。

     

    2、原理图符号(第2部分)

    2.1、二极管

    基本二极管通常用压在一条线上的三角形表示。二极管也是极化的,因此两个终端中的每一个都需要区分标识符。正极,阳极是进入三角形平坦边缘的终端。负极,阴极延伸出符号中的线(将其视为符号)。

    有各种不同类型的二极管,每个二极管在标准二极管符号上都有特殊的riff。发光二极管(LED)通过指向远处的几条线来增强二极管符号。从光产生能量的光电二极管(基本上是微小的太阳能电池),将箭头翻转并指向二极管。

    其他特殊类型的二极管,如肖特基或齐纳二极管,都有自己的符号,符号的条形部分略有不同。

     2.2、晶体管

    晶体管,无论是BJT还是MOSFET,都可以以两种配置存在:正掺杂或负掺杂。因此,对于这些类型的晶体管中的每一种,至少有两种方法来绘制它。

    2.2.1、双极结晶体管(BJT)

    BJT是三端设备;它们有一个集电极(C),发射极(E)和一个基极(B)。有两种类型的BJT分别是NPN和PNP,它们每种都有自己独特的符号。

     

    集电极(C)和发射极(E)引脚彼此成直线,但发射极应始终有一个箭头。如果箭头指向内部,则为PNP,如果箭头指向外,则为NPN。或者看箭头,总是P指向N的

    2.2.2、金属氧化物场效应晶体管(MOSFET)

    与BJT一样,MOSFET有三个端子,但这次它们被命名为源极(S),漏极(D)和栅极(G)。同样,该符号有两种不同的版本,具体取决于您是否有N沟道或P沟道MOSFET。每种MOSFET类型都有许多常用符号:

    符号中间的箭头定义MOSFET是N沟道还是P沟道。如果箭头指向意味着它是一个n沟道MOSFET,如果它指出它是一个p沟道。

    2.3、数字逻辑门

    我们的标准逻辑功能AND,OR,NOT和XOR-都具有唯一的原理图符号:

     添加泡到输出否定的功能,则创建与非门,NORs的,和XNORs:

    它们可能有两个以上的输入,但形状应该保持不变(好吧,可能更大),并且应该仍然只有一个输出。

    2.4、集成电路

    集成电路完成了如此独特的任务,而且数量众多,它们并没有真正获得独特的电路符号。通常,集成电路由矩形表示,其中引脚从侧面延伸出来。每个引脚都应标有数字和功能。

    ATmega328微控制器(通常在Arduinos上找到),ATSHA204加密IC和ATtiny45MCU的原理图符号。如您所见,这些组件的大小和引脚数量差异很大。

    由于IC具有这样的通用电路符号,因此名称,值和标签变得非常重要。每个IC应具有精确识别芯片名称的值。

    独特的IC:运算放大器,稳压器

    一些更常见的集成电路确实获得了独特的电路符号。您通常会看到如下所示的运算放大器,总共5个端子:非反相输入(+),反相输入(-),输出和两个电源输入。

    通常,在一个IC封装中内置两个运算放大器,只需要一个引脚用于电源,一个用于接地,这就是为什么右边只有三个引脚。

    简单的稳压器通常是三端子元件,带有输入,输出和接地(或调节)引脚。这些通常采用矩形的形状,左侧(输入),右侧(输出)和底部(接地/调整)具有引脚。

    2.5、杂记

    2.5.1、晶体和谐振器

    晶体或谐振器通常是微控制器电路的关键部分。它们有助于提供时钟信号。晶体符号通常有两个端子,而为晶体添加两个电容器的谐振器通常有三个端子。

    2.5.2、接头和连接器

    无论是提供电源还是发送信息,连接器都是大多数电路的要求。这些符号取决于连接器的外观,下面是一个示例:

    2.5.3、电机,变压器,扬声器和继电器

    我们将它们混为一谈,因为它们(大多数)都以某种方式使用线圈。变形金刚(不是眼睛以上的类型)通常涉及两个线圈,相互对接,有几条线将它们分开:

    继电器通常将线圈与开关配对: 

    扬声器和蜂鸣器通常采用与现实生活相似的形式:

     电机通常与终端周围多一点点缀涉及将环绕“M”,有时是:

    2.5.4、保险丝和PTC

    保险丝和PTC-通常用于限制大电流的设备-每个都有自己独特的符号:

     

    PTC符号实际上是热敏电阻的通用符号,是一个与温度相关的电阻

    毫无疑问,这个列表中有许多电路符号,但上面的那些应该让你在原理图读数中有90%的识字率。通常,符号应与其建模的现实组件共享相当大的数量。除符号外,原理图上的每个组件都应具有唯一的名称和值,这有助于识别它。

    位号和值

    值(Value)有助于准确定义组件的内容。对于电阻器,电容器和电感器等原理图,该值告诉我们它们有多少欧姆,法拉或亨利。对于其他组件,如集成电路,该值可能只是芯片的名称。晶体可能将其振荡频率列为其值。

    位号(Default)通常是一个或两个字母和一个数字的组合。名称的字母部分表示组件的类型电阻器的R,电容器的C,集成电路的U,等等。示意图上的每个组件名称应该是唯一的;例如,如果电路中有多个电阻,它们应命名为R1,R2,R3等。元件名称有助于我们参考原理图中的特定点。

    名称的前缀非常标准化。对于某些组件,如电阻器,前缀只是组件的第一个字母。其他名称前缀不是那么直接;例如,电感器是L(因为电流已经占据了i)。这是一个常见组件及其名称前缀的快速表:

    尽管这些是组件符号的“标准化”名称,但它们并未得到普遍遵循。例如,您可能会看到以IC为前缀而不是U的集成电路,或标有XTAL而不是Y的晶体。用你最好的判断来诊断哪一部分是哪一部分。符号通常应该传达足够的信息。

    3、阅读原理图

    了解哪些组件在原理图中的哪一部分是理解它的一半以上的战斗。现在剩下的就是确定所有符号是如何连接在一起的。

    3.1、网络,节点和标签

    原理图网络告诉您组件如何在电路中连接在一起。网络表示为组件终端之间的线。有时(但并非总是)它们是一种独特的颜色,如本原理图中的绿线:

    3.2、交汇点和节点

    电线可以将两个端子连接在一起,也可以连接数十个。当导线分成两个方向时,会形成一个连接点。我们用节点表示原理图上的连接点,在线的交叉点放置小点。

    节点为我们提供了一种方式来说明“穿过这个交叉点的电线是连接的”。在交叉点处缺少节点意味着两条单独的线路正在经过,而不是形成任何类型的连接。(在设计原理图时,通常很好的做法是尽可能避免这些非连接重叠,但有时这是不可避免的)。

    3.3、网络名称

    有时,为了使原理图更清晰,我们将给网络命名并标记它,而不是在原理图上布线。假设没有连接它们的可见导线,假定连接具有相同名称的网络。名称可以直接写在网络的顶部,也可以是“标签”,悬挂在电线上。

    具有相同名称的每个网连接,如在本示意性用于FT231X接口板。名称和标签有助于防止原理图过于混乱(想象一下,如果所有这些网络实际上都与电线连接)。

    网络通常被赋予一个名称,专门说明该线路上信号的用途。例如,电源网可以标记为“VCC”或“5V”,而串行通信网络可以标记为“RX”或“TX”。

    3.4、原理图阅读技巧

    3.4.1、识别模块

    真正广泛的原理图应该分成功能块。可能有一个部分用于电源输入和电压调节,或微控制器部分,或专门用于连接器的部分。尝试识别哪个部分是哪个部分,并遵循从输入到输出的电路流程。优秀的原理图工程师甚至可能像电子书一样放置电路,左侧输入,右侧输出。

     

    如果原理图的抽屉非常好(就像为RedBoard设计此原理图的工程师),他们可能会将原理图的各个部分分成逻辑的标记块。

    3.4.2、识别电压节点

    电压节点是单端子原理图组件,我们可以将组件端子连接到它们,以便将它们分配到特定的电压电平。这些是网名的特殊应用,意味着连接到同名电压节点的所有终端都连接在一起。

    类似的电压节点-如GND,5V和3.3V-都连接到它们的对应部分,即使它们之间没有电线。

    接地电压节点特别有用,因为许多组件需要接地。

    3.5、参考组件数据表

    如果原理图上的某些内容没有意义,请尝试查找最重要组件的数据表。通常,在电路上工作最多的组件是集成电路,如微控制器或传感器。这些通常是最大的组件,位于原理图的中心。

    展开全文
  • 1. 在C语言中,数字常量如果没有后缀‘U'或'u',则默认为是有符号数。 例: 其中1024和oxff这两个常量都是有符号数,这就意味着每个赋值操作包含了一个隐式的由有符号数到无符号数的类型转换。 而1024u和0xffu则视...

     

     

     

    1. 在C语言中,数字常量如果没有后缀‘U'或'u',则默认为是有符号数。
    例:



    其中1024和oxff这两个常量都是有符号数,这就意味着每个赋值操作包含了一个隐式的由有符号数到无符号数的类型转换。
    而1024u和0xffu则视为无符号数。

    2. 同类型整数之间的类型转换:


    这样的类型转换是指不同字长的无符号数或有符号数之间的类型转换,如由short转为int,或是有unsigned short转换为unsigned。
    无符号数由短变长使用零扩展,使用0来填充多出来的高字节。
    例:


    a的二进制表示为1011,0010,b的二进制表示为0000,0000,1011,0010,这就是零扩展。零扩展对于应汇编(ia32)指令movz。


    有符号数一般使用补码表示,有符号数的由短变长的转换使用符号扩展,即较短的数的二进制表示的最高位是0则用零扩展,同无符号数的零扩展,而如果是1,则用1来补充缺少的位
    例:



    a的二进制表示为1011,0010,b的二进制表示为1111,1111,1011,0010。当然,此时b的大小仍是-78。

    由长变短则更简单,直接截断即可,高位的字节直接丢掉,低位的字节保持不变。


    3. 有符号数和无符号数之间进行类型转换:



    当发生有符号数和无符号数之间的强制类型转换时,如果他们的长度是相同(比如int和unsigned一般都是4个字节,short和unsigned short都是两个字节),那么在位一级的表示上并没有变化,即如果都转化为二进制的形式来看,都是一样的。虽然从二进制01组成的角度来看是一样的,但我们要知道有符号数和无符号数的区别是最高位的权值发生了变化,有符号整数用补码表示,最高位的权值是-2^(w-1),w为位宽,如int类型w大小为32,而无符号整数的最高为的权值为2^(w-1)。而如果两个数长度不同,则先进行前面提到的2中长度的转换,再进行类型转换。

    4. 有符号数和无符号数在一起进行运算时,要首先将有符号数转换为无符号数,再进行运算。


    例:

    这样可以得到什么结果呢?

    首先n转化为无符号数,大小为65535,所以输出是m<n。

    本质按位比较,看谁大

    5. 整型常量


    在1中我们说,如果一个常数没有后缀,那么默认的是int类型,如果后缀是u,则默认为unsigned int。但这样的说法并不完整。

    首先,我们默认了常数的格式是十进制,但是十六进制的也很常用。

    然后,还可能出现这样的情况:给出的常数的值已经超越了int或是unsigned int的范围。这种情况又该如何处理?

    可能目前为止都没有遇到过这种情况,但是如果发生该如何理解呢?别急,C标准对这些情形都给出了明确的说明,了解之后你就会知道为啥不知道也没有发生错误。

    看完下面这张表你也许悟到了点啥,莫名其妙也没关系,让我们来细说一例:

    “十进制常数”和“none”后缀的对应的格子里的内容是:

    int

    long int

    long long int

    这三行的意思是对于没有后缀的十进制常数,如1024和3147483647,首先用int类型来匹配,int类型值得范围是-2147483648~2147483647(这里可以看出有符号整型的范围不是对称的,而且此处默认int类型为32位),1024在此范围之内,那么这个常数的类型就是int了,但3147483647不在此范围之内,即int类型罩不住,那么看第二行, long int 类型, 其范围还依赖于机器的字长,一般32位机上为-2147483648~2147483647,还是罩不住,再看第三行,long long int,其范围是-9223372036854775808到9223372036854775807,所以3147483647最终匹配的类型是long long int。

    对于八进制或十六进制的常数,如果没有后缀,会先匹配有符号数,再匹配无符号数,毕竟从取值的绝对值的范围的角度上看无符号数更广。

    如果一个常数大的表中没有任何类型能够表示,那么就要看有没有扩展类型能够表示它,如果没有,那么这个常数没有类型。

    -2147483648这个常数会是什么类型?不一定是int类型,这还要看编译器,很可能编译器会把它当成一个64位的有符号整型(可能是long long int),或者说该编译器在识别常数时可能认为int类型的范围是-2147483647~2147483647,但是我们应该知道32位的int类型是可以表示-2147483648。所以求int类型的绝对值也不那么简单,需要考虑这种情况。

    我们知道,C代码会被编译为针对某种处理器架构的汇编代码,然后生成机器码,机器码才能够被cpu执行。在C代码时看起来很简单的逻辑,变为机器码后就很难读懂了,也就是说C代码比汇编代码和机器码对人类来说有更好的可读性。我们也知道一般用C语言进行底层开发,如开发Linux操作系统,为什么不用java呢,因为C语言更硬一些,更方便对硬件功能进行抽象描述,C语言在高级语言中并不那么高级。C标准中,整数分为有符号整数和无符号整数,但是归根到底是要放到寄存器中才能进行运算的(所有的高级语言层面抽象出来的数据结构和在这之上的操作,最终都要基于最底层硬件的寄存器、指令等来表现,中间转化过程一般有编译器完成),而寄存器是没有有符号和无符号的属性的,32位cpu上的寄存器由32个二进制位组成,至于其中放的是有符号数还是无符号数,则要看你怎么用它,就如一棵树,你可以把它做成家具,也可以把它当成柴火,要看你的需求。比如我们要将4位的整数1011扩展为8位的整数,如果我们(其实是编译器的工作)认为它是无符号的数,那么可以使用零扩展转移指令,变为00001011;如果认为是有符号,可以使用符号扩展转移指令,变为11111011(补码表示)。如果我们任性的要把4位的有符号的数变为8位无符号的数,也可以,但是要制定统一的规则,比如C标准中有该规定,那么这种转化就是可移植的,如果没有统一的规则,每个编译器都有自己的搞法,这件事就变成了依赖于编译器的事情,这就是所谓的依赖性。所谓的可移植性就是有统一的标准,所谓的不可移植,即依赖性,就是因为大家各搞各的。


    参考CSAPP和C99
    ————————————————
    版权声明:本文为CSDN博主「fhyangchina」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/fhyangchina/article/details/55250934

    展开全文
  • MannWhitney U-test 曼-惠特尼U检验 ...参考曼-惠特尼U检验与威尔科克森符号秩检验是最常用的两独立样本非参数检验方法,无需对总体分布做出假定,可以用来比较两组分布未知的样品差异。Mann–Whitney U-test (曼-惠特
  • c++中的无符号数与有符号

    千次阅读 2021-03-20 11:57:41
    把int转换成无符号数的过程和把int直接赋值给无符号变量一样。 unsigned u = 10; int i = -42; std::cout<<i + u <<std::endl;//输出-84 std::cout<< u + i <<std::endl;//如果int占32位,...
  • ES6之符号符号属性

    万次阅读 2019-12-16 23:50:02
    在 JS 已有的基本类型(字符串、数值、布尔类型、 null 与 undefined )之外, ES6 引入了一种新的基本类型:符号(Symbol)。符号起初被设计用于创建对象私有成员,而这也是 JS 开发者期待已久的特性。在符号诞生...
  • 数学符号大全

    千次阅读 2021-02-26 17:52:02
    前言不知道有没有同学在csdn上写博客跟我一样,想写一个数学公式却苦于没有数学符号,例如我想打出一个属于符号,只能打出(-这种丑陋的符号,正好发现有位同学博客里贴出了很多常用的数学符号,这里转载一些,感谢这...
  • C语言中的符号总结

    万次阅读 2021-05-21 15:55:19
    1、注释符号 //和/* ...*/2、续行符号 \3、转义符号 常用:\r 和 \n 等4、单引号 ‘括起来的一个字符代表整数5、双引号 “括起来的字符代表一个指针单引号 ‘括起来的一个字符代表整数...
  • 特别符号大全,特殊符号大全

    万次阅读 2020-12-19 11:18:13
    ❤ ♥ ღ人民币符号 ¥ ¥日元符号 ¥ ¥(和人民币符号一样,日元单位日文写法:円)欧元符号€英镑符号£美元符号$港币符号是:HK$,代表符号是$,由于世界上部分国家和地区都在使用dollar,为了区别,所以美元用U.S...
  • 符号数和无符号数的转换及思考

    万次阅读 多人点赞 2016-09-16 21:00:51
    1 有符号数和无符号数的表示三者的最高位均为符号位.我以前一直没弄明白的是为何8位补码的表示范围是-128~127, 今天查阅了相关资料,于此记下。仍然以8位为例:原码原码的表示范围-127~-0, +0~+127, 共256个数字。正...
  • 目录一、补码二、负数时的有符号整型和无符号整型的转换三、关于无符号的笔试题一、补码有符号数在计算机中存储,用数的最高位存放符号, 正数为0, 负数为1例如:有符号数 1000 0011,其最高位1代表负,其真正数值是 ...
  • C++有符号和无符号

    2019-11-26 22:01:32
    负数,无论是赋值给有符号数,还是无符号数,内存中二进制的表示形式是一样的;显示成有符号还是无符号,是根据printf的格式化参数来决定的。 %d是按照有符号输出,%u是按照无符号输出。 u_int32_t a ...
  • 平时经常要输入一些“★”、“√”之类的特殊符号,或是“壹万贰仟叁佰肆拾伍元”之类的大写金额,很多朋友不知道该如何通过常用输入法快速输入,另外在使用输入法过程中,也时常会出现用五笔输入时有些字不会拆分...
  • python平方符号

    千次阅读 2020-12-02 16:02:26
    翻译:老齐与本文相关图书推荐:《跟老齐学python:数据分析》----在机器学习项目中,你肯定要在代码中实现各种运算,其中必然要用到各种数学符号,因此,必须了解并熟知如何实现。 本文列出常用的数学符号及其...
  • (二)、整型变量整型变量是用来存储...整型变量可以是有符号型、无符号型、长型、短型或象上面定义的普通符号整型。整型是16位的,长整型是32位,短整型等价于整型。以下是几种整型变量的声明示例:long int Amount; ...
  • 一、符号符号表 Global symbols(模块内部定义的全局符号) – 由模块m定义并能被其他模块引用的符号。 例如,非static函数和非static的全局变量(指不带static的全局变量) 如,main.c 中的全局变量名buf ...
  • java 转义字符"\u0010" "\010" "\2"等

    千次阅读 2021-03-03 12:23:46
    java转义字符\xxx 八进制转义符\uxxxx 十六进制转义符"\010","\u0010"这种字符串,不要以为它们长度大于1,其实它们仅占一个字节,也就是由 '\010'和'\u0010'组成的单字节字符串,那么这两个字符究竟代表什么呢?...
  • latex中的求和符号,连乘符号

    万次阅读 2018-07-26 21:46:54
    求和符号: \sum_{i=1}^{n} 左侧的“ \sum ”代表求和符号, ...连乘除了最前面的词不一样,别的都和求和符号一样,下面再说求和符号其他形式。连乘都可以参考   求和符号不加上标 \sum_{i=1} 求和符号...
  • 这篇博文我们仅仅关注启动过程本身,想要吃透 U-Boot,有太多东西需要学习!最开始我想放到一篇文章中,写着写着内容越来越多,最终超过了 CSDN 编辑器的限制。。。最终决定把内容拆分成多篇文章。你可能需要: 1. ...
  • linux——nm命令:查看符号

    万次阅读 2019-12-18 17:23:39
    nm 命令显示关于指定 File 中符号的信息,文件可以是对象文件、可执行文件或对象文件库。所谓符号,通常指定义出的函数,全局变量等等。 使用 nm [option(s)] [file(s)] 有用的options: A 在每个符号信息的...
  • 有/无符号数加减法

    千次阅读 2021-07-23 09:41:22
    当所有操作数和结果数据位宽一样时,有符号数和无符号数所产生的运算电路是一样的。 当所有操作数和结果数据位宽不一样时,无符号数进行0扩展,而有符号数进行符号扩展。 在verilog中支持无符号数和有符号数混合使用...
  • C语言无符号数与有符号数的运算原则,一些容易踩坑的点
  • 一、关于C语言中有符号的整数值范围为什么是从-32768~32767 对于有符号整型,也就是int型,是和编译器的字长有关的,只有在16位编译器上,int类型占2个字节,其表示范围才是-32768~32767; 对于32位和64位编译器,...
  • 输出打印%d 和%u ,细节决定成败

    千次阅读 2021-12-13 10:48:08
    所以,%d在解释过程中第一位数据代表了符号,%u第一位数据代表了数据值 在输出一下数据时就有: int a = -1; printf("%d\n%u",a); 1 2 -1 4294967295 1 2 因为-1的补码为 11111111 11111111 11111111 11111111 %d...
  • LaTeX 特殊符号、加帽子符号、横线和波浪线

    千次阅读 多人点赞 2019-09-23 22:16:48
    加帽子符号 latex中如果想在字母上加上一个帽子(尖角)符号应该怎样表达呢? (1)如果是在正文中Z^ZZ,例如用^{Z}即可; (2)如果是在公式中Z^\hat{Z}Z^,例如用\hat{Z}即可。 加横线和波浪线 加^号 输入\...
  • hhd,hhx,hhu, 这几个都是输出8位的, hd, hx, hu, 这几个都是输出16位数据的, d, lx, ld, lu, 这几个都是输出32位的...%llu 是64位无符号 %llx才是64位16进制数 Dev-C++下基本数据类型学习小结 环境...
  • 一、无符号数 无符号数二进制的乘除,就相当于左移或者右移了 2的几次方倍(如下图) 无符号数加法是进位,减法是借位;(进/借最高位) 例如: 1的补码是 0000 0001 2的补码是 0000 0010 -2的补码是1111 1110 ...
  • 十六进制数后跟L/U/UL解析

    千次阅读 2021-05-22 14:44:37
    整数类型分类整数类型又分为两大类:有符号型和无符号型。有符号整数如果为正数或零,那么最左边的位(符号位)为0;如果为负数,则符号位为1。因此,最大的16位整数的二进制表示形式是0111 1111 1111 1111,对应的值...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 190,080
精华内容 76,032
热门标签
关键字:

像u一样的符号