精华内容
下载资源
问答
  • 位扩展详解

    千次阅读 2012-03-05 17:57:55
    首先要知道我们的数据是怎么样放入内存的,例如我们int a=2;sizeof(int)=2;那么放入内存的数据为00000000 00000010,假设int a=-2,那么存放为11111111 11111110,始终记住在内存里存放的是补码形式,正数的补码是本身...
     
    

    首先要知道我们的数据是怎么样放入内存的,例如我们int a=2;sizeof(int)=2;那么放入内存的数据为00000000 00000010,假设int a=-2,那么存放为11111111 11111110,始终记住在内存里存放的是补码形式,正数的补码是本身。现在要用printf输出,就先要到内存里面去得到数,假设%d形式输出,则函数根据符号为进行求源码,如果是%u输出则函数认为内存里存放的为无符号数,所以直接输出数字11111111 11111110=65534。

           假设我们把一个int赋给char的,那么int 就要被截断了,底8位不动的直接挪给char,例如unsigned char c;

    C=a;那么c对应的内存为11111110(当a=-2),当我们输出格式为%d,%u的时候都是254哦,这和unsigned int a=-2不一样,当我们输出格式为%d,%u的时候一个正数,一个负数。

           假设我们相反把一个char赋给int,那么就要进行符号扩展了,谭书上60页说了:

    如果把字符处理为无符号的,那么int的高位全部补0;

    如果把字符处理为有符号的,那么int的高位与char放在内存的数据的最高为扩展,例如char c=-2,在内存里面格式为11111110,那么int a=c,a的格式为11111111 11111110,如果char c=2,在内存的存放为00000010,那么int a=c,a的格式为00000000 00000010

    记住printf的格式控制是从内存里面取数据,在进行相应的转换的

    2

           当我们输入数据的时候假设int a=2,那么内存里面高位扩0,但是如果int a=65535,那么16为已经满了它不会写成0 11111111 11111111因为这样已经17位了

    一个符号扩展的例子:

    typedef struct {

            int a:2;  1

            int b:2;  2

            int c:1;  3

         }test;

         test t;

         t.a = 1;     4

         t.b = 3;     5

         t.c = 1;     6

         printf("%d",t.a);   7

         printf("%d",t.b);   8

         printf("%d",t.c);   9

         谢谢!

    t.a为01,输出就是1

    t.b为11,输出就是-1

    t.c为1,输出也是-1   ---位扩展

    解释:a不说,对于b来说,t.b=3,写进内存为11,因为已经满2位了,所以直接进驻内存,不用扩展符号,(不考虑补码的形式),但printf输出的是int型,所以要进行到2到16位的扩展,因为申明的是int b:2;所以高16位字节与b的最高位一样为111111111 11111111,所以输出为%d的形式输出为-1,如果%u的形式,那么输出为65535.

    假设我们在第2行中把int b:2,写成unsigned int b:2,那么结果就变了哦,这就导致了进行符号扩展的时候全部补0,结果是在内存的格式就是00000000 00000011输出的两种都为3.

    负数的补码

      符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
      同一个数字在不同的补码表示形式里头,是不同的。比方说-15的补码,在8位2进制里头是11110001,然而在16位2进制补码表示的情况下,就成了1111111111110001。在这篇补码概述里头涉及的补码转换默认了把一个数转换成8位2进制的补码形式,每一种补码表示形式都只能表示有限的数字。
      【例2】求-7的补码。
      因为给定数是负数,则符号位为“1”。
      后七位:+7的原码(0000111)→按位取反(1111000)→加1(1111001)
      所以-7的补码是11111001。
      已知一个数的补码,求原码的操作分两种情况:
      (1)如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
      (2)如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。
      再举一个例子:求-64的补码
      +64:01000000
      11000000
      【例3】已知一个补码为11111001,则原码是10000111(-7)。
      因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
      其余七位1111001取反后为0000110;
      再加1,所以是10000111。
    展开全文
  • 最近在树莓派上做开发, 遇到了一个奇怪的问题 for example: ... 怎么不按照符号位进行扩展? 后来我查了下资料 如下: ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char

    最近在树莓派上做开发, 遇到了一个奇怪的问题

    for example:

    char a = 0x8f;

    printf("%d", a);

    我们希望得到  -113, 但是在树莓派上面得到的却是 143

    这是怎么回事? 怎么不按照符号位进行扩展?

    后来我查了下资料
    如下:

    ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char
    char相当于signed char或者unsigned char,但是这取决于编译器!

    这三种字符类型都是按照1个字节存储的,可以保存256个不同的值。
    不同的是取值范围
    signed char取值范围是 -128 到 127
    unsigned char 取值范围是 0 到 255
    signed char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255。


    但是char究竟相当于signed char呢还是相当于unsigned char呢??
    这就是char和int的不同之处!
    int==signed int,但是char不能简单以为==signed char

    要确定char究竟等同什么要基于不同的编译器做测试
    大多数机器使用补码来存储整数,在这些机器中按照整数类型存储的-1的所有位均是1
    假设我的机器也是如此存储,就能据此判断char究竟是等于signed char还是unsigned char
    在实际使用过程种有什么区别呢?

    主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。

    但是我们却发现在表示byte时,都用unsigned char,这是因为byte没有符号位之说

    如果是char,那么系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned int也会扩展),而如果是unsigned char,那么不会扩展。

    这就是二者的最大区别。

    展开全文
  • 王者荣耀进入S19赛季以后,新英雄镜的胜率确实让玩家有点看不懂,该英雄的胜率还不到50%,登场率不足10%,这英雄的弊端越来越明显,官方也是在体验服对镜紧急进行了暂时屏蔽,估计是对镜要做新一轮的加强,让我们...

    王者荣耀进入S19赛季以后,新英雄镜的胜率确实让玩家有点看不懂,该英雄的胜率还不到50%,登场率不足10%,这位英雄的弊端越来越明显,官方也是在体验服对镜紧急进行了暂时屏蔽,估计是对镜要做新一轮的加强,让我们拭目以待吧。

    2953e221dd7ebc995c769c96ab37741d.png

    我们都知道本赛季坦克类英雄加强,玩家一般会选则坦边打上单,最近有粉丝问我,猪八戒这位英雄哪位英雄才能克制他呢?我们都知道猪八戒这位英雄英雄比较肉,用版本强势的上单英雄很难克制猪八戒,估计很难占据上风,今天嘟嘟哥就给大家推荐两位可以克制猪八戒的两位英雄。

    0f13a2346281c80a3355e9a4148d3353.png

    夏侯惇

    首先要说的就是夏侯惇,这位英雄虽然被天美加强之后,但是登场率并没有明显的好转,夏侯惇的被动技能血量低于50%时,普攻可以恢复自身百分比的生命值,一技能可以可以释放两次,不但可以对敌人造成物理伤害和减速效果,并且一技能二段还有控制效果。

    879907fa2a20f6d3599e8cd3dc294db4.png

    想要打过猪八戒,夏侯惇的二技能是主要技能,该技能可以为自身增加一层可以吸收270点物理伤害,而且接下来的三次普攻都会附带真实伤害,夏侯惇的三技能在释放期间处于霸体状态,并且还可以对敌人造成眩晕效果,需要注意的三技能释放之后,会对附近的区域造成持续的物理伤害,依靠一三技能的控制效果,配合二技能打出真实伤害,对线猪八戒绝对不虚。

    986e597b7c13be68428cec2ad55e4ec6.png

    吕布

    还有一位克制猪八戒的英雄,就是吕布,这位英雄虽然两个赛季出场率都很低,所以有不少玩家呼吁天美加强该英雄,我们有一说一,吕布这位英雄确实要加强了,二技能的护盾基本没有什么用,三技技能只能逃跑使用,不过该英雄的“天魔缭乱”皮肤已经优化完成,估计吕布会被加强一下。

    64bfe41e8ff38645c83663ce3006ad1e.png

    吕布的攻击距离要远大于普通战士类英雄,该英雄的被动技能只要在附魔状态下,可以对敌人造成真实伤害,一技能是该英雄的核心技能,只要技能命中敌人之后武器就会附魔,会对敌人造成650点的物理伤害,并且还会额外附带190点的真实伤害,二技能虽然可以减速敌人,并且还可以为自身增加护盾,大招释放之后只要大招范围命中敌人,武器会自动附魔,并且可以将敌人击飞一秒。

    65b2d5a0b37940f3cf76b41d35547574.png

    吕布这位英雄虽然在本赛季不是那么强势,但是我们在排位赛中,一定要选能克制敌方的英雄,不要一味的选择强势英雄,所以吕布依靠二技能的回血和自身的真实伤害,再“肉”的猪在吕布面前只能认怂。

    57fdf58b6e6c769abb63efa74c91954a.png在看点一下 大家都知道0b9db5ed5f755a021d205d9487a4faad.png
    展开全文
  • 高八位7F是因为p2.7为0是选通8255的cs片选端,第八是FC,FD,FE,FF是由8255内部结构决定的,芯片的技术手册上会有,其实也是由最后两的组合进行选择2.在用C51的P0,P2口做外部扩展时使用,其中XBYTE [0x0002],P2...

    1. 然后它说8255的A口、B口、C口、控制寄存器的地址分别为7FFCH、7FFDH、7FFEH、7FFFH。这个是怎么算出来的?

    高八位7F是因为p2.7为0是选通8255的cs片选端,第八位是FC,FD,FE,FF是由8255内部结构决定的,芯片的技术手册上会有,其实也是由最后两位的组合进行选择

    2.在用C51的P0,P2口做外部扩展时使用,其中XBYTE [0x0002],P2口对应于地址高位,P0口对应于地址低位。一般P2口用于控制信号,P0口作为数据通道。

    比如:P2.7接WR,P2.6接RD,P2.5接CS,那么就可以确定个外部RAM的一个地址,想往外部RAM的一个地址写一个字节时,地址可以定为XBYTE [0x4000],其中WR,CS为低,RD为高,那就是高位的4,当然其余的可以根据情况自己定,然后通过

    XBYTE [0x4000] = 57;

    这赋值语句,就可以把57写到外部RAM的0x4000处了,此地址对应一个字节。

    个人总结:

    以下图为例

    P0口接了8根 低地址 地址线

    P2口低4位接了4根 高地址 地址线

    P2口高3位接了3根 控制信号线 RD WR CS

    P2口P2.7没用

    这样P0,P2口接的外围设备有12位的 地址线,3根控制线,1根未使用的线,

    那么这个外围器件的地址范围是

    XXXX 0000 0000 0000-XXXX FFFF FFFF FFFF

    XXXX 是从0000-FFFF的16种不同的组合,那么由 XXXX 0000 0000 0000-XXXX FFFF FFFF FFFF组成的地址范围就会有16中不同的表示范围,但是这16中不同的地址表示都是指同以物理地址。这就是 物理地址对应的映射地址不唯一。

    例如:0000 0000 0000 0000和1111 0000 0000 0000都是指同一物理地址

    0000 0000 0000 0000和0000 0000 0000 0001指的是不同的物理地址

    这样XXXX就可以作为控制信号线来使用

    如果想对XXXX 0000 0000 0000地址进行 RD=0 WR=1 CS=1 这样的操作

    RD,WR,CS分别对应P2.4 P2.5 P2.6

    X110 0000 0000 0000(X可以是1或者0,这里选1,那么1110 0000 0000 0000=0xe000)

    那么可以通过命令:XBYTE[0xe000]=0 来实现

    这句C语言命令的汇编命令如下:

    mov dptr,#e000h

    mov a,#0h

    movx @dptr,a

    如果把 X110 0000 0000 0000中X=0,那么 0110 0000 0000 0000=0x6000

    那么实现以上操作是:XBYTE[0x6000]=0 来实现

    从上面可以看出 最高位 未用的位设置位0或者1没有任何影响,只是形式不同而已,

    此处 XBYTE[0xe000]=0 和 XBYTE[0x6000]=0 等价

    如果想对XXXX 0000 0000 0000地址进行 RD=1 WR=0 CS=1 这样的操作

    X101 0000 0000 0000=0xc000(X=1) 或者=0x5000(X=0)

    命令为 XBYTE[0xc000]=0,或者XBYTE[0x5000]=0

    如果想对想对XXXX 0000 0000 0000地址进行 RD=1 WR=0 CS=1 这样的操作,并且向A0-A12这12位数据线输出数值57,那么命令为:XBYTE[0xc000]=57或者XBYTE[0x5000]=57

    如果想对想对XXXX 0000 0000 0001地址进行 RD=1 WR=0 CS=1 这样的操作,并且向A0-A12这12位数据线输出数值57,那么命令为:XBYTE[0xc001]=57或者XBYTE[0x5001]=57

    3.、程序存储器扩展实例

    1、用一片2716芯片扩展2K程序存储器

    1)地址线连接:2716的存储容量为2K*8,需11位地址(A10~A0)进行存储单元的选择。为此先把芯片的A7~A0与地址锁存器的8位地址输出对应联接,剩下的高位地址(A10~A8)与P2口的P2.2~P2.0相连。这样2716芯片的内存储单元的问题就解决了。

    2)数据线的连接:程序存储器的数据输出引脚到P0口对应连接。

    3)控制信号线的连接:程序存储器的扩展只涉及到外部存储器选通信号PSEN,此信号与2716的OE端相接,以便进行存储单元的读出选通。

    4)片选线的连接:因为这是一个小规模存储器扩展系统,采用线选法比较方便,为此只需在剩下的高位地址线中选取P2.7作芯片选择信号与2716的CE端相连即可。

    5)扩展芯片的地址范围:

    最低地址:当A0~A10取值为0000000000时。

    A15

    P2.7

    A14

    P2.6

    A13

    P2.5

    A12

    P2.4

    A11

    P2.3

    A10

    P2.2

    A9

    P2.1

    A8

    P2.0

    A7

    P0.7

    A6

    P0.6

    A5

    P0.5

    A4

    P0.4

    A3

    P0.3

    A2

    P0.2

    A1

    P0.1

    A0

    P0.0

    0

    X

    X

    X

    X

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    .

    1

    0

    .

    1

    0

    .

    1

    0

    .

    1

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0

    0000H、0800H、1000H、1800H、2000H、2800H、…..7800H、7FFFH

    最高地址:当A0~A10取值为11111111111时。

    A15

    P2.7

    A14

    P2.6

    A13

    P2.5

    A12

    P2.4

    A11

    P2.3

    A10

    P2.2

    A9

    P2.1

    A8

    P2.0

    A7

    P0.7

    A6

    P0.6

    A5

    P0.5

    A4

    P0.4

    A3

    P0.3

    A2

    P0.2

    A1

    P0.1

    A0

    P0.0

    0

    X

    X

    X

    X

    1

    1

    1

    1

    1

    1

    1

    1

    1

    1

    1

    0

    0

    .

    1

    0

    .

    1

    0

    .

    1

    0

    .

    1

    1

    1

    1

    1

    1

    1

    1

    1

    1

    1

    1

    07FFH、0FFFH、17FFH、17FF H、27FFH、2FFFH…..7FFFH

    所以,该联接方式程序存储器的地址范围为:0000H~07FFH、0800H~0FFFH、

    1000H~17FFH………

    这种地址范围重叠是线选法本身造成的。因此地址范围的非惟一性是线选法的一大缺点。

    A15接的是CE(片选)

    当A15=0时:16位二进制地址范围0XXX X000 0000 0000-0XXX X1111 1111 1111

    当A15=1时:16位二进制地址范围1XXX X000 0000 0000-1XXX X1111 1111 1111

    此处X表示该位可为 0或1 中的任意值,那么XXXX的范围 0000-1111(16)

    那么0XXX X000 0000 0000-0XXX X1111 1111 1111(有16种地址表示)

    1XXX X000 0000 0000-1XXX X1111 1111 1111(也有16种地址表示)

    这就意味着:

    当A15=0时,对于同一物理地址,有16种不同的地址值可以表示(同一地址,地址值不唯一)

    同样,当A15=1时,对于同一物理地址,有16种不同的地址值可以表示(同一地址,地址值不唯一)

    展开全文
  • C语言中的无符号扩展和带符号扩展

    千次阅读 2015-03-21 15:57:28
    C语言中,当不同类型的数据进行运算的时候,就会发生强制或隐式类型转换,通常是低精度的数据类型扩展到高精度的。有些时候,低精度的位数比较少,扩展到高精度的时候,就要在前面补充一些。那么这些是补0还是补...
  • 开发火狐浏览器扩展

    2016-09-14 18:08:00
    话说最近阿里的某几程序员因为使用自己写的js脚本进行内部的抢月饼活动,导致被某些人恶意定性为不公平竞争,最后被开除。至于其中的因果关系,我是不怎么care的,不过我觉得写脚本也是能力的体现啊。言归正传,...
  • 请教各位大神,在C语言中怎么对一个有八十扩展双精度浮点数求开方呢。因为sqrt()函数好像只支持单精度和双精度的开方,所以我想对于扩展双精度的开方是否需要进行分段呢,但是又不知道怎么做,求大神赐教!!!
  • KlakLASP是一个扩展为创建具有使用克拉克布线系统音频React行为。 KlakLASP集成了插件来分析音频信号。 由于LASP具有低延迟特性,因此不会在音频输入和操作之间引入明显的延迟。 系统要求 Unity 2017.1或更高版本 ...
  • 项目做完,公司安全测试,说系统有安全漏洞,日志中未对用户信息进行脱敏处理,需要我对手机号进行脱敏处理,至少隐藏四。锅从天上来,一期的项目的安全漏洞,之前没有安全测试,二期项目结束,测出来了,一脸懵的...
  • 进行存储器扩展时,可供使用的编址方法有两种,即:线选法和译码法。-------线选法所谓线选法,就是直接以...【例5-1】现有2K*8存储器芯片,需扩展8K*8存储结构采用线选法进行扩展扩展8KB的存储器结构需2KB的...
  • 序列号(TRACE)由“MMDDHHmmss”+四流水号(从0000到9999),长度为14,能保证一年不重复,如“06241304350345”,表示6月24日13点04分35秒第345个包。 注:以下描述中元素值全为Text类型;所标长度为最大长度...
  • 在浏览器下载一张线条简单且画面清晰的标图,用AdobeIllustratorCS6软件打开该图片,用选择工具选中图片,点击图像描摹的倒三角,选择低保真度图片进行图像描摹,点击扩展显示路径,点击路径并点击鼠标右键取...
  • 1、准确——-换气要快而准确,在乐句结束时,留有很短的时间进行快速换气,任何情况下都不能占用下一句第一个音符的时值。2、合适——换气时,要看乐句的工短和力度变化的需要来吸气,不要任何时都吸同样多的气,更...
  • 问题分析: fedora安装进行分区的时候需要建立自己的主分区,因为同一块硬盘上(主分区+扩展分区)的数目不能超过4个,也就是说是有数量限制的。如果当前你的win7系统里(主分区+扩展分区)的数目已经超过了2个,那么...
  • 问题分析: fedora安装进行分区的时候需要建立自己的主分区,因为同一块硬盘上(主分区+扩展分区)的数目不能超过4个,也就是说是有数量限制的。如果当前你的win7系统里(主分区+扩展分区)的数目已经超过了2个,那么...
  • 02 (HEX):开关量输入15009-15010状态,其中0是15009,1是15010 09 (HEX):CRC校验高字节 B9 (HEX):CRC校验低字节 3、控制继电器输出成功 功能码:05,支持广播 首地址:00001 命令帧格式:下行 ...
  • 或许是一个可以改变你刷题效率的浏览器扩展插件。 总结题型以及思路。 内置各种常见刷题模板。 更方便地看仓库题解,甚至可以基于公司筛选 一键复制测试用例 上班刷题必备的“摸鱼模式” 等等 插件地址:...
  • 基数排序是桶排序的扩展,他的基本思想是:将整数按切割成不同的数字,然后按每个位数分别比较。 具体做法是:将所有待比较数值统一为同样的位数长度,数较短的数前边补零。然后,从最低开始,依次进行一次...
  • 设计模式-引言

    2013-12-10 17:04:26
    为了怎么样可以让工作进行的很好。 总是把软件的稳定性放在第一,这个我想乔帮主可能是不同意的,对于殿堂级的设计者怎么想的真心没法想象出来。 对于不断扩展的东西,要保证有很好的稳定性,就要看设计...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 208
精华内容 83
关键字:

怎么进行位扩展