判断两个带符号数的大小关系

1.问题

存储单元内以补码形式表示的两个带符号数X和Y,要判断X和Y的大小关系,可采用如下的算法:

若X、Y两数符号相同,且(X-Y)为正,表明X>Y;否则,X<Y。若两数符号不同,则根据符号判定大小。

2.源程序

int x,y;
int compdata(int x1,int y1);
void main()
{
    int bigdata;
    x=0x8fef;y=0x8fed;
    bigdata=compdata(x,y);
}
int compdata(int x1,int y1)
{
    int temp;
    temp=x1;
    temp=temp^y1;
    if(temp==0)
        return x1;   //两数相等
    else 
    {
        if((temp&0x8000)==0)  //两数同号
        {
            temp=temp^y1;  //恢复temp为x1;
            temp=temp-y1;  //temp=x1-y1
            {
              if((temp&0x8000)==0)
                  return x1;
             else 
                 return y1;
            }
        }
        else if((temp&0x8000)!=0) //两数异号
        {
            temp=temp^y1;
            if((temp&0x8000)==0)
                return x1;
            else 
                return y1;
        }
     }
 }    

求得较大数为0x8fef。

Verilog 中处理有符号数大小判断时,通常需要考虑数值的二进制表示法以及如何通过硬件描述语言准确地表达比较逻辑。以下是关于 Verilog 有符号数大小判断的一些要点: ### 一、基本概念 #### 1. 补码表示 在计算机系统中,有符号整数常采用补码形式存储,最高位作为符号位(0代表正数,1代表负数)。对于n位带符号数据x,其范围为\(-2^{(n-1)}\)到\(2^{(n-1)} - 1\)。 例如8-bit signed integer [-128~+127]。 #### 2. 比较操作符 可以直接使用`>` , `<`, `>=`, `<=`等关系运算符对两个信号进行比较,前提是这两个信号都是按照正确的格式声明了是有符号类型的变量或线网类型,并且它们之间确实可以相互转换成相同的宽度来进行对比;如果未指定,则默认按无符号数对待。 ```verilog wire signed [7:0] a = -5; // 定义了一个8bit宽的signed wire并赋值为-5 wire signed [7:0] b; assign b = (a > 4'd6) ? 8'b1 : 8'b0; ``` 这里需要注意的是当涉及到跨模块传递的时候一定要保证接收端也明确指定了该输入是带有符号属性的数据类型,这样才能确保最终结果正确。 另外,在某些老版本仿真工具里可能会存在一些bug导致即便已经明确了是否为有符号量还是会出现误判的情况发生,因此建议尽量避免混合使用不同类型的数值直接参与算术运算和条件分支语句之中。 ### 实现例子 下面给出一段简单的示例代码演示如何基于给定的一组规则完成两个固定点小数之间的最大最小选择任务: ```verilog module SignedComparator ( input wire signed [WIDTH-1:0] x, input wire signed [WIDTH-1:0] y, output reg [WIDTH-1:0] max_val, output reg is_greater_or_equal ); always @(*) begin if(x >= y) {is_greater_or_equal,max_val} <= {{1{1'b1}},x}; else {is_greater_or_equal,max_val} <= {{1{1'b0}},y}; end endmodule ``` 在这个实例里面我们创建了一个叫做SignedComparator的功能单元,它接受任意长度的两路有符号向量输入X,Y,经过内部逻辑分析后会把较大的那个存入max_val寄存器内同时设置标志位来指示前者是不是大于等于后者的关系成立与否。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值