-
2019-10-03 19:41:44
verilog符号数问题主要涉及【常数】、【变量】、【运算符】。
一、整型数
1、十进制数
普通十进制数一律被认为是有符号数,如32 //有符号数
-15 //有符号数
1
2
2、基数格式的表示法
基数格式表示情况下,数的符号要明确声明,如8'sh51 //8位有符号数01010001
6'so72 //6位有符号数111010,即十进制数下的-6
1
2
对于未声明符号位的,按无符号数处理4'd2 //4位无符号数
'hAF //32位16进制数,无符号。注意未声明长度的,统一按32位长度处理
1
2
二、变量
当将一个常数赋值给某个变量时,仿真器如何解释这个常数的值,最终取决于这个变量的符号形式,此时常数的符号仅仅决定常数的各位取1还是0而已。
将一个有符号常量赋值给一个无符号变量可能会出现意想不到的结果。reg [5 : 0] burst_data;
burst_data = -4'd12;//-4'd12转换成二进制数为110100,而burst_data为无符号reg型变量,
//所以最终将储存在其中的二进制数翻译成52
1
2
3
作为对比有:integer burst_data;
burst_data = -4'd12;//-4'd12转换成二进制数为110100,integer为有符号型整形变量,
//所以最终将储存在其中的二进制数翻译成有符号数-12
1
2
3
下面对常用变量类型的符号情况做一下总结。1、wire
wire型变量要明确声明其符号。wire [signed] [[msb:lsb]] net1;
1
2、reg
reg型变量要明确声明其符号。reg [signed] [[msb:lsb]] reg1;
1
3、integer
integer型变量不必也不允许声明符号,其中存储的二进制数本身就代表有符号数。integer interger1;
1
三、算数操作符
在一个表达式中混合使用有符号操作数和无符号操作数时,必须非常小心。
只要有一个操作数时有符号的,在运算开始前,所有其他的操作数都被转换成了无符号数。'd2+4'sb1001//第一个操作数为无符号数,第二个操作数为有符号数,故第二个数被认为是无符号数9,结果为9+2=11
1
为了完成有符号数的运算,可以使用 $signed 和 ¥unsigned系统函数控制操作数的符号行为。$signed('d2)+4'sb1001 //-5
---------------------
版权声明:本文为CSDN博主「PPOP95」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/a453697601/article/details/85056699更多相关内容 -
双字节二进制无符号数除法
2020-08-25 18:55:25入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。 出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。 -
计算机组成原理实验 Quartus 四位无符号数乘法器
2019-02-21 11:17:03计算机组成原理实验 Quartus 四位无符号数乘法器 -
有符号数和无符号数详解
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/1061308301. 通过例子看问题
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位操作系统中
(普及概念:-
8位的CPU,一次只能处理一个8位的“数据”或者一个8位的"指令"。比如’00001101’。
-
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 有符号数和无符号数的区别
- 有符号数和无符号数的区别:
在32位编译器中,有符号数的二进制位最高位表示-2^ 31,而无符号数的二进制位最高位表示的是2^31 - 无论它是有符号数还是无符号数,它的二进制表示肯定都是唯一的
(不可能在有符号形式下有一种表示,在无符号形式下也有一种表示)
3. 原码、反码、补码
3.1 背景
- 负数表示问题
在数学中,任意基数的负数都在最前面加上“−”符号来表示。
在计算机硬件中,数字都以无符号的二进制形式表示。
但是负数如何用二进制表示呢? - 解决:
当前通过:原码、反码、补码,用于扩展二进制数字系统,来表示有符号数。
3.2 原码、反码、补码
3.2.1 什么是机器数?
机器数就是 数在计算机中的二进制表示形式。
机器数是带符号的,在计算机中用二进制数的最高位存放符号, 正数为0, 负数为1。
例如:- 计算机字长为8位,则:
十进制数+3 ,转换成二进制00000011,
十进制数-3 ,转换成二进制10000011。
那么,这里的00000011和10000011就是机器数。
3.2.2 什么是真值?
真值就是真正的值。
因为二进制数的最高位是符号位,所以机器数的形式值就不等于真正的数值。
为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
即第一位用±表示数字的正负,其余为二进制数。
例如:
0000 0001的真值= +000 0001,1000 0001的真值= –000 0001。3.2.3 原码、反码、补码
-
原码:
就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。例如: 1 的源码 0000...0001 -1的原码:1,000...0001
-
反码:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反例如: 1的反码还是1 如-1的补码为1,111...1110
-
补码:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+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的最大值。
也就是0xFFFFFFFF5. 计算机为什么采用补码来进行运算
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 -
-
有符号数和无符号数详解(2)补码详解
2020-05-14 23:01:41有符号数和无符号数详解(2)补码详解1. 为什么需要补码1.1 背景2 补码的思想2.1 我们希望只设计加法运算器,不用减法运算器。2.2 现在问题是:怎么表示-1呢?3. 补码3.1 补码的优点3.2 例子:4. 补码的本质:参考 1...有符号数和无符号数详解(2)补码详解
有符号数和无符号数详解
https://blog.csdn.net/lqy971966/article/details/1060333321. 为什么需要补码
大多数计算机对整数使用二进制补码编码表示!!!
1.1 背景
(只设计加法运算器)
在计算机内,整数的长度是确定的,在字长为32位的计算机中,整数的长度就是32个二进制,这其中还包括了符号位(0表示正,1表示负)。
这里面我们为了方便描述,就假设机器字长为8位。例如,十进制整数 19,二进制真值表示为 10011,其原码表示为 0001 0011。
十进制整数-19,二进制真值表示为-10111,原码表示为 1001 0011。简而言之,源码就是最高位为符号位,其他位表示该数的绝对值
如果计算机内部采用原码表示数,那么在进行加法和减法运算的时候,最终都转化为两个绝对值的加运算和减运算,
因此,在设计计算器的时候就既需要设计加法运算器,又要设计减法运算器(代价有点大,是否可以就用一种类型的运算器呢?
其实大多数人都喜欢做加法运算,不太喜欢用减法运算)。2 补码的思想
(从-1的由来说起)
2.1 我们希望只设计加法运算器,不用减法运算器。
我们希望找到一种方案,采用这种方案做加运算 1 + ( -1 )
用 0000 0000表示0是很自然的想法,用 0000 0001到 0111 1111表示1到127的正数,也是自然的想法
2.2 现在问题是:怎么表示-1呢?
我们做一次逆向思维,0000 0001加上什么样的二进制数可以得到0000 0000?
即:从右向左思考,加数的最右边的最低位必须是1
即:0000 0001 + (1111 1111)= 1 0000 0000
无论结果最后是多少,都只保留8位,多余的位会被丢弃。因此,我们可以将 1111 1111来表示-1
下面就是采用一种方式来合理的将-1怎么变成 1111 1111这种形式。3. 补码
(解决了只设计加法运算器,不设计减法运算器)
带符号整数有原码、反码、补码等几种编码方式。
正整数的原码、反码和补码都一样
负数的反码是对原码的除符号位外的其他位进行取反后的结果
而补码是先求原码的反码,然后在反码的末尾位加1后得到结果,即补码是反码+13.1 补码的优点
它的便利体现在,所有的加法运算可以使用同一种电路完成。
3.2 例子:
以-8作为例子。
假定有两种表示方法。一种是直觉表示法,即10001000;另一种是-8补码表示法,即 1111 1000
随便写一个计算式,16 + (-8) = ?
16的二进制表示是 00010000,所以用直觉表示法,加法就要写成:
00010000
+10001000
---------
10011000
可以看到,如果按照正常的加法规则,就会得到10011000的结果,转成十进制就是-24。显然,这是错误的答案。
也就是说,在这种情况下,正常的加法规则不适用于正数与负数的加法。
因此必须制定两套运算规则,一套用于正数加正数,还有一套用于正数加负数。
从电路上说,就是必须为加法运算做两种电路。现在,再来看 8 的补码表示法。
00010000
+11111000
---------
100001000
可以看到,按照正常的加法规则,得到的结果是100001000。
注意,这是一个9位的二进制数。我们已经假定这是一台8位机,因此最高的第9位是一个溢出位,会被自动舍去。
所以,结果就变成了00001000,转成十进制正好是8,也就是16 + (-8) 的正确答案。
展到整个整数集,从而用一套电路就可以实现全部整数的加法。4. 补码的本质:
要将正数转成对应的负数,其实只要用0减去这个数就可以了。
比如,-8其实就是0-8。
已知8的二进制是00001000,-8就可以用下面的式子求出:
00000000
-00001000
---------
11111000
0不够借,最高位借1
补码的两个转换步骤就是这么来的。参考
-
编译原理—— 识别无符号数的词法分析器设计实现
2010-01-04 11:01:35选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。 输入:由无符号数和+,-,*,/, ( , ) 构成的算术表达式,如1.5E+2-100。 输出:对识别出的每一单词均单行输出其类别码(无... -
计算机组成原理计算机的运算方法——无符号数和有符号数
2020-10-09 14:26:20计算机的运算方法——无符号数和有符号数无符号数有符号数机器数与真值源码表示法整数小数补码表示整数小数快速获取补码方法反码表示整数小数快速取反方法移码表示 无符号数 定义:没有正负号的数 寄存器的位数表示... -
无符号数运算相减/有符号数表示运算问题(一)
2021-10-05 22:29:09一、无符号数 无符号数二进制的乘除,就相当于左移或者右移了 2的几次方倍(如下图) 无符号数加法是进位,减法是借位;(进/借最高位) 例如: 1的补码是 0000 0001 2的补码是 0000 0010 -2的补码是1111 1110 ... -
关于C++无符号数跟有符号数相加的问题
2019-08-30 11:42:07无符号数跟有符号数在一个表达式时,会先将有符号数根据位数取模再跟无符号数相加。 如图所示  运行结果![图片说明]... -
无符号数与有符号数比较大小
2017-04-16 18:54:07申明: 本博文源自:http://blog.csdn.net/qiuchangyong/article/details/7495008 在此感谢博主!...结果输出: 1因为无符号数与有符号数比较时,要将有符号数转化为无符号数,再来比较。a 转化为 -
C - 有符号数和无符号数扩展
2018-11-28 11:47:06将无符号数转换为更大的数据类型时, 只需简单地在开头添加0,这种运算称为0扩展。将有符号数转换为更大的数据类型需要执行符号扩展,规则是将符号位扩展至所需要的位数。扩展的原则是: 有符号的数据类型,在向高... -
c/c++ 有符号数与无符号数的转换
2015-11-25 09:43:08在开发中,经常会碰到有符号数与无符号数之间的转换,有时是隐性,有时是显性。如果不清楚其中规则,则可能带来非常难以排查的bug。 -
计算机怎么识别有符号数和无符号数的
2019-11-06 09:36:13这个问题我在学习汇编语言的过程中一直很苦恼,在网上看了很多帖子,基本上都是说是人自己设定是有符号数还是无符号数的。这样的回答是很扯淡的,TM计算机和人脑又不是一个东西,看来很多人学东西基本上都是一知半解... -
一个字节的无符号数能表达的数值范围是0----255,
2021-07-23 00:13:56两个字节代表可以储存的最大数为2^16=65536,两个字节若不考虑符号问题,那么可以储存0-65536个数。考虑符号问题,二进制第一位为符号位,则储存的最大数为2^15=32768。0不属于正数也不属于负数,所以有符号的情况下... -
【编译原理】无符号数的识别
2015-11-17 09:37:23无符号数的识别 -
C语言系列(二)有符号数和无符号数详解
2019-06-03 13:12:20转 1、你自已决定是否需要有正负: 就像我们必须决定某个量使用整数还是实数,使用多大的范围数一样,我们必须自已决定某个量...在计算机中,可以区分正负的类型,称为有符类型(signed),无正负的类型(... -
C++无符号数比较大小
2020-07-07 10:24:24在代码中看到如下代码: static constexpr Timestamp MAX_DURATION = 0x7000000000000000;...说明:Timestamp类型为UInt64Type 即无符号64为整型,t_0与t_1为两个测量时间戳,差值不会很大。 概念: -
无符号整型数的反转
2018-11-05 10:57:37无符号整形数的反转 在编写这道题的程序时,费了老大劲才写出了这样的程序:(小白求轻拍) unsigned char reverse_bit_char(unsigned char y) { int i = 0; unsigned char blank = 0x01; unsigned char ... -
C语言中无符号数和有符号数相加比较的问题
2018-10-16 12:39:25转自https://blog.csdn.net/supreme42/article/details/6687781 看个题: #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n",a+b); (a+b)>6? puts("... -
C语言中无符号数和有符号数之间的运算
2019-06-26 11:09:31https://www.cnblogs.com/qingergege/p/7507533.html https://blog.csdn.net/tantao900827/article/details/49045997 -
怎么区分有符号数和无符号数
2016-06-26 13:18:59我还是搞不清指令本身是如何区分有符号数和无符号数!(问题汇总) 论坛的一个CSDN提问,对各方面的回答进行了汇总,答案还算比较清楚的。 一般好像是有专门的有符号数指令和无符号数指令 比如 无符号除... -
有符号数和无符号数的范围
2017-10-28 15:26:20无符号数:最高位不用来表示正负,它没有负数,比如,4位无符号数表示的范围,0000-1111,大小即0-15, 有符号数:最高位用来表示正负, 对于有符号数表示的范围我们要着重谈一下,4位有符号数,负数最小值很多人... -
Verilog编写的浮点数加法器,无符号。
2021-11-20 09:08:37Verilog编写的浮点数加法器,无符号。 -
C语言关于有符号和无符号变量相互赋值的探讨
2020-09-19 01:05:10研究1:有符号变量转化位无符号变量会怎么转换,下面是代码例子 #include <stdio.h> int main (void) { signed char temp1=-10; unsigned char temp2=0; for(;;) { temp2=temp1; pri... -
汇编中有符号与无符号数以及CF,OF标志位的区分
2016-05-01 20:04:20汇编中有符号与无符号数以及CF,OF标志位的区分 -
有符号数与无符号数之间运算问题
2016-02-03 23:03:26//7中:u-i2,该表达式中u是无符号数,i2是有符号数,运算时先将i2转为补码形式(因为是i2为正数所以数值不变),所以u-i2=10-42=-32,而显然表达式的结果必须是无符号数,所以-32就隐式转为无符号数(补码形式的数值... -
【C语言】有符号和无符号数的比较运算
2019-12-06 13:42:14如果寄存器 r5 中代表的无符号数据小于寄存器 r4 中代表的无符号数据的话,执行CMP指令之后,进位标志位置位,这里显然无符号数0xFFFFFFFF是大于0x01的。 BGE表示判断 r5 是否大于等于 r4,如果是,则跳转,... -
嵌入式编程常考的无符号数和有符号数的运算问题
2017-09-14 21:17:571、有符号数与无符号数之间运算问题 以下实验均在virual c++6中运行通过 这个问题测试是否懂得C语言中的整数自动转换原则,有些开发者懂得极少这些东西。当表达式中存在有符号类型和无符号类型时 所有的操作数... -
负数时的有符号整型和无符号整型的转换
2021-05-22 12:57:58目录一、补码二、负数时的有符号整型和无符号整型的转换三、关于无符号的笔试题一、补码有符号数在计算机中存储,用数的最高位存放符号, 正数为0, 负数为1例如:有符号数 1000 0011,其最高位1代表负,其真正数值是 ...