精华内容
下载资源
问答
  • 有符号数与无符号数的运算

    千次阅读 2015-03-31 16:29:51
    有符号数与无符号数的运算规则如下: 表达式中既有无符号数又有有符号数,则有符号数会自动转换为无符号数,然后进行计算。such as: int i; unsigned j; cout ; 首先将i自动转换成无符号数,然后与j相加,输出...

    C++的int等类型数据默认为有符号的。

    对于无符号数,必须保证其值不能为负数,否则就会造成意外。

    有符号数与无符号数的运算规则如下:
    表达式中既有无符号数又有有符号数,则有符号数会自动转换为无符号数,然后进行计算。

    such as:
    int i;
    unsigned j;
    cout << i+j;
    首先将i自动转换成无符号数,然后与j相加,输出。

    注意:i转换为无符号数,若i>=0,那么结果不变,若i<0,则结果等于这个负数加上无符号数的模。

    无图无真相,先来一发:
    unsigned i;
    i=-1;
    cout << “i= ” << i << endl;
    图1

    然后,再来一发:
    for(unsigned i=9; i >= 0; –i )
    cout << i << endl;
    可能大部分人都认为最后i=-1,不符合条件,结束循环……万事大吉?
    错!
    由于i是无符号数,所以,当i=0,执行–i的时候,变成-1,-1自动转换为无符号数,变成i=4294967295,由于i>0,所以,继续执行–i,然后……继续……最后……然后……继续……无穷尽也!
    这里写图片描述

    陷阱:由于i是无符号数,因此,i不能取-1,而是自动变成(-1+模),是一个很大的数。
    解决办法,将for循环改成
    while( i > 0 )
    {
    –i;
    cout << i;
    }

    展开全文
  • 本文介绍了C语言中有符号数和无符号数之间进行运算的规则
  • 数据宽度 在计算机中由于受硬件限制,数据是有一定长度限制(称为数据宽度),超过最多宽度数据会被丢弃。 1. 常见数据宽度 位:里面只能存放一个值(0或1),计算机中最小存储单位 ...1. 无符号...

    数据宽度

    在计算机中由于受硬件的限制,数据是有一定长度限制的(称为数据宽度),超过最多宽度的数据会被丢弃。
    1. 常见的数据宽度
    在这里插入图片描述
    位:里面只能存放一个值(0或1),计算机中最小存储单位
    字节:一个字节有8个位
    字:有16位
    双子:可以存储32位
    2. 存储范围在这里插入图片描述
    例如:
    char :计算机就知道要用容器是8位(1个字节)
    int:计算机就知道你要用的容器是32位的(双字)

    有无符号数

    不同的编码不同的规则

    1. 无符号数的编码规则
    在这里插入图片描述
    无符号数:这个数是多少就存多少
    文件不同,解析方式也不同

    2. 有符号数 正数编码规则
    在这里插入图片描述
    原码:最高位(最左面)为符号位,其余各位为数值本身绝对值
    反码:
    正数:反码与原码相同
    负数:符号位为1,其余位对原码取反
    补码:
    正数:补码与原码相同
    负数:符号位为1,其余位对原码取反加1(1是值)
    正0和负0的补码相同
    正数和负数的相加实质是:把正数和负数的补码相加,然后再补码,同位相加都为1的话进位。
    3. 举例说明
    正数编码:
    在这里插入图片描述
    负数编码:
    符号为1
    在这里插入图片描述
    4. 假设数据宽度为1,Byte(8 bit)
    在这里插入图片描述
    5. 假设数据宽度为 Doubleworld(32 bit)
    在这里插入图片描述

    位运算

    前言:
    计算机只认识和,计算机所做的运算归根结底是直接对0和1做运算,通常称:位运算。

    为什么要学位运算:
    1)必须要位运算来实现,比如说:调试器,判断CPU各种状态位
    2)试题:比如2*8效率最高的实现方式

    1. 与运算
    两个数都为1结果才为1
    比如:
    在这里插入图片描述
    2. 或运算
    在这里插入图片描述
    3. 异或运算
    在这里插入图片描述
    4. 非运算
    在这里插入图片描述
    5. 移位运算
    左移
    在这里插入图片描述
    右移
    在这里插入图片描述
    而对于C语言来说,高位补零还是1看前面定义:比如说unsigned 意为无符号,没有定义unsigned默认就是有符号的,最高位就为符号位。

    6. 总结
    计算机的所有运算归根结底都会转换为位运算,计算机只会做位运算

    7. 通过位运算实现四则运算
    举例:加法
    在这里插入图片描述
    运算过程:
    在这里插入图片描述
    减法:
    在这里插入图片描述

    展开全文
  • C语言中有符号数与无符号数的加法预算: unsigned int与int相比,拥有更大的正数范围。所以,无符号数与有符号数进行运算时,先需要将有符号数转化为无符号数进行操作。以下代码所展示出的结果,...

    C语言中的自动类型转换:

    在C语言中,进行混合运算时,编译系统遵循一定规则,完成数据类型的自动转换,即隐式类型转换。一般是占用内存字节数少类型,向占用内存字节数多的类型进行转换,以防止精度丢失。

    C语言中有符号数与无符号数的加法预算:

    unsigned int与int相比,拥有更大的正数范围。所以,无符号数与有符号数进行运算时,先需要将有符号数转化为无符号数进行操作。以下代码所展示出的结果,就验证了这一特点。

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(int argc, char *argv[])
    {
    	int data1 = -10;
    	unsigned int data2 = 5;
    
    	printf("%d\n", data1 + data2);
    	(data1 + data2) > 0 ? printf("大于0\n") : printf("小于0\n");
    	system("pause");
    	return 0;
    }

    在上述代码中,-10会被编译器转换为无符号的int类型,其二进制形式为:1111 1111 1111 0110(与其绝对值相同的正数10正是它取反加一的结果)。它与无符号数5(二进制形式为0000 0000 0000 0101)相加的结果,就是1111 1111 1111 1011。这个数被作为无符号数在进行比较时,是远远大于0的;做输出时,因为有%d,即以有符号数int型进行输出,所以打印的结果是-5(1111 1111 1111 1111是-1,上面的数第三个二进制位为0,所以比-1小4,即为-5)。

    再看下面一段代码:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(int argc, char *argv[])
    {
    	int a = -1;
    	unsigned int b = 2;
    	a >= b ? printf("yes\n") : printf("no\n");//yes
    	
    	system("pause");
    	return 0;
    }

    无符号的int类型与有符号的int类型在进行比较时,也会将有符号数转换为无符号数再进行比较。同理,将-1的补码作为正数形式比较,远远大于2。

    且让我们再将以上代码稍加改动:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(int argc, char *argv[])
    {
    	int a = -1;
    	unsigned int b = 2;
    	(a+b) > 0 ? printf("yes\n") : printf("no\n");//yes
    	
    	system("pause");
    	return 0;
    }

    当a与b进行加法运算时,int类型数据溢出,高位被自动舍弃,结果为正数1,所以大于0。

    如下代码即可验证a+b的值为1:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<stdlib.h>
    
    int main(int argc, char *argv[])
    {
    	int a = -1;
    	unsigned int b = 2;
    	(a+b) == 1 ? printf("yes\n") : printf("no\n");//yes
    	
    	system("pause");
    	return 0;
    }

    解决此类问题,只需记得同类型有无符号数进行加减或比较时,会先将有符号数转换为无符号数进行操作,这样即可根据数值的补码自行判断结果。

     

    展开全文
  • rule of thumb The format of the signed type is two’s complement. 有符号数均为补码表示 If any operand in an expression is ... 只有计算表达式右边有无符号数,整个计算式都按照无符号数规则运算 只有...

    rule of thumb

    1. The format of the signed type is two’s complement. 有符号数均为补码表示
    2. If any operand in an expression is unsigned the operation is considered to be unsigned. 只有计算表达式右边有无符号数,整个计算式都按照无符号数规则运算
    3. 只有算式右边全为有符号数,运算才会自动补齐所需的bit数,n+n=n+1.n*n=2n
    4. The value -4 represented as a 3bit signed hex value would be specified as -3’sh4. A decimal number is always signed. verilog2001中用’s来特别声明有符号数,十进制的数都是有符号数
    5. Type casting using $unsigned will make the operation unsigned. The operand will be sign extended with 0’s if necessary. $usigned()函数在高位补0
    6. A=$signed(B) will extend using sign bit. $unsigned()函数会在高位补与符号位相同的bit

    basic signed addition

    两个n bit数相加,得到n+1 bit结果,比如-2(3’sb110)+3(3’sb011)=1(4’sb0011)

    //Code Example 1: Addition - Verilog 1995
    module add_signed_1995 (
    input [2:0] A,
    input [2:0] B,
    output [3:0] Sum
    );
    assign Sum = {A[2],A} + {B[2],B};
    endmodule // add_signed_1995
    
    //Code Example 2: Addition - Verilog 2001
    module add_signed_2001 (
    input signed [2:0] A,
    input signed [2:0] B,
    output signed [3:0] Sum
    );
    assign Sum = A + B;
    endmodule // add_signed_2001
    

    signed + unsigned

    如果是两个3bit有符号数+1bit进位。如果在verilog2001中直接用符号位拓展

    sum=A+B+carry_in //整个计算式会转换成无符号计算,signed to unsigned conversion occurs
    sum=A+B+$signed(carry_in) //就会出现当carry_in=1时候拓展为4'b1111,这时候本来是加1,却变成了减1
    sum = A + B + $signed({1'b0,carry_in}) //正确的做法
    

    正确的做法是

    // Code Example 3: Add with Carry - Verilog 1995
    module add_carry_signed_1995 ( 
    input [2:0] A,dsa
    input [2:0] B,
    input carry_in,
    output [3:0] Sum
    ); 
    assign Sum = {A[2],A} + {B[2],B} + carry_in; 
    endmodule //add_carry_signed_1995
    
    // Code Example 5: Add with Carry - Correct
    module add_carry_signed_final (
    input signed [2:0] A,
    input signed [2:0] B,
    input carry_in,
    output signed [3:0] Sum
    );
    assign Sum = A + B + $signed({1'b0,carry_in});
    endmodule // add_carry_signed_final
    

    basic signed multiplication

    两个n bit数相乘,得到2n bit结果。如果-3(3’sb101) * 2 (3’sb010) 得到正确结果 -6 (6’sb111010)。但如果乘数是负数,则最高位的乘积需要以减法参与运算,而不是加法。

    // Code Example 6: Signed Multiply - Verilog 1995
    module mult_signed_1995 (
    input [2:0] a,
    input [2:0] b,
    output [5:0] prod
    );
    wire [5:0] prod_intermediate0;
    wire [5:0] prod_intermediate1;
    wire [5:0] prod_intermediate2;
    wire [2:0] inv_add1;
    assign prod_intermediate0 = b[0] ? {{3{a[2]}}, a} : 6'b0;
    assign prod_intermediate1 = b[1] ? {{2{a[2]}}, a, 1'b0} : 6'b0;
    // Do the invert and add1 of a.
    assign inv_add1 = ~a + 1'b1;
    assign prod_intermediate2 = b[2] ? {{1{inv_add1[2]}},
    inv_add1, 2'b0} : 6'b0;
    assign prod = prod_intermediate0 + prod_intermediate1 +
    prod_intermediate2;
    endmodule
    
    // Code Example 7: Signed Multiply - Verilog 2001
    module mult_signed_2001 (
    input signed [2:0] a,
    input signed [2:0] b,
    output signed [5:0] prod
    );
    assign prod = a*b;
    endmodule
    

    signed * unsigned

    prod = a*b; //整个运算变成无符号,-3(3'sb101)*2(3'b010)变成5(6'b000101)*2(6'b000010)=10(6'b001010)
    prod = a*$signed(b); //当乘数的MSB=1的时候会出错,2(3'sb010)*7(3'b111)变成
                         //-2(6'sb000010)*-1(6'sb111111)=2(6'sb110010)
    prod = a*$signed({1'b0,b}); //正确做法
    
    // Code Example 11: Signed by Unsigned Multiply
    module mult_signed_unsigned_2001 (
    input signed [2:0] a,
    input [2:0] b,
    output signed [5:0] prod
    );
    assign prod = a*$signed({1'b0,b});
    endmodule
    

    signed shift

    逻辑移位’>>’, ‘<<‘会补零,算术移位’<<<’, '>>>'会补符号位

    A = 8'sb10100011
    A>>3; //8'b00010100 
    A>>>3;  //8'b11110100
    
    展开全文
  • 有符号数和无符号数运算的时候,有符号数会自动向无符号数转换 1 #include<iostream> 2 #include<ctime> 3 #include <stdio.h> 4 #include<cstring> 5 #include<cstdlib&...
  • 无符号二进制数的算术运算

    千次阅读 2019-02-24 19:50:16
    一、无符号二进制数的运算规则: 无符号二进制数的加、减、乘、除四则算数运算法则其实与十进制数的四则算数运算法则是一一对应的。如果你理解了十进制的四则算数运算法则,那么理解无符号二进制数的四则运算相对来...
  • C/C++的规则是,如果一个Unsigned和一个signed做数学运算,结果就是一个足够大能包含结果unsigned。 但是C#似乎没有这样的规则。我想知道C#标准(spec)有没有这方面规定? 例如 short s1 = 3000; ushort ...
  • 在C表达中,如果同时出现有符号数和无符号数,那么c会隐含将有符号数强制类型转换为无符号数,并假设两个数都是非负数,来执行整个运算
  • 负数原码首先计算其二进制,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码基础上进行+1操作。System.out.println( 8 >> 1);//正数进行右移位运算8二进制是 0000 0000 0000 0000...
  • 对大多数 C 语言实现而言,处理同样字长有符号数和无符号数之间相互转换一般规则是:数值可能会改变,但是位模式不变。    由于 C 语言对同时包含有符号和无符号数表达式这种处理方式,出现了一些...
  • 有符号数与无符号数

    2016-03-24 20:14:37
    编译器的隐式提升无符号整数和有符号整数在进行比较,或者算数运算的时候,有一些隐蔽的规则 ...建议是尽量使用有符号数,此时要注意出现无符号数的时候,强制把无符号数字转化为有符号数字进行判断,但是
  • 负数原码首先计算其二进制,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码基础上进行+1操作。System.out.println( 8 >> 1);//正数进行右移位运算8二进制是 0000 0000 0000 0000...
  • 目录移位运算逻辑移位无符号数的移位称为逻辑移位,移位规则为:逻辑左移,高位丢弃,低位补0;逻辑右移,高位补0,低位丢弃。如0000100,逻辑左移1位为0001000;逻辑右移1位为0000010算术移位有符号数的移位称为...
  • C - 有符号数和无符号数扩展

    千次阅读 2018-11-28 11:47:06
    无符号数转换为更大数据类型时, 只需简单地在开头添加0,这种运算称为0扩展。将有符号数转换为更大数据类型需要执行符号扩展,规则是将符号位扩展至所需要位数。扩展原则是: 有符号数据类型,在向高...
  • 2)二进制简写形式二、进制运算1)八进制运算表(1) 加法运算表(2)乘法运算表(3)八进制简单运算题三、数据宽度1)什么是数据宽度2)计算机中常用基本数据宽度四、无符号数有符号数 进制 进制也就是进位计数制,...
  • 有符号数转无符号数的扩展问题

    千次阅读 2012-02-13 23:17:19
    答案是使符号位参加运算,从而简化加减法的规则,使减法运算转成加法运算,从而简化机器的运算器。计算机中无论是字符类型,或者是整数类型,也无论这个整数是几个字节。它都用全1来表示 -1。比如一个字节的数值中:...
  • verilog数值计算-有符号数和无符号数

    万次阅读 2017-03-13 17:18:07
    verilog数值计算-有符号数和无符号数 位宽截断 算术运算 有符号数赋值 位宽截断 位宽大数赋值给位宽小数,数据就会被截断,截断的规则就是从低位开始取,被截断是高位 codewire [5:0] a; wire [4:0] f; ...
  •  负数原码首先计算其二进制,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码基础上进行+1操作。  System.out.println( 8 >> 1);//正数进行右移位运算 8二进制是 0000 0000 ...
  • 当表达式中存在有符号类型和无符号类型时,所有操作数都自动转换成无符号类型。 有符号数如何转换成...-7与正数做运算,根据规则是先转换为无符号数,再做运算,那就是说是; 11111111 11111111 11111111 11111001
  • 二进制算术运算:两个二进制数进行加法运算规则,和十进制数基本相同。唯一的区别在于二进制数是“逢二进一”,而十进制数是“逢十进一”。我们可以把一位二进制数的加法结果全计算出来,如下: 0+0=0 0+1=1 1+0=1...
  • 正负数移位运算规则

    2020-10-13 10:47:00
    (无符号右移) 】 << 规则: 按二进制形式把所有数字向左移动对应位数,高位移出(舍弃),低位空位补零。 语法格式: 意义: 在数字没有溢出前提下,对于正数和负数,左移一位都相当于乘以21次方,...
  • ,无符号右移 &gt;&gt;&gt;1.左移 &lt;&lt; 箭头向左,往高位移动左移运算符&lt;&lt;指指定所有位有左移 规定次数1)格式: value &lt;&lt; num ; num要移动次数规则:...
  • 算术运算的RTL代码规则总结

    千次阅读 2019-05-16 11:03:52
    对有符号数以及无符号数运算的一些指导规则。 注:英文为原文,中文为个人认为重要总结。 1. Signed Arithmetic • Rule: Use type 'signed' (VHDL, Verilog 2001) for signed/2's complement arithmetic (d...
  • 算术移位:有符号数的移位 逻辑移位:无符号数移位 1、 算术移位:正数移位后出现的空位均添0.负数对其空位补缺规则不同。不管正数还是负数,移位后的符号位都不变 2、 逻辑移位:将操作数当做无符号数看待,移位...
  • 我想出一种分析思路,源于之前看到名为《Verilog关于有符号数与无符号数的数值运算》的博客,感触良多,但是用该分析方法在实践中出现了问题,现结合经验对部分分析提出修改意见,如下: 运算原则: Verilog中乘法...
  • 逻辑移位对象是无符号数,移位规则:逻辑左移时,高位移丢,低位添0;逻辑右移时,低位移丢,高位添0 二、算术移位 算术移位对象是有符号数,在移位过程中符号位保持不变。 三、循环移位 (a)不带进位...
  • 第一个问题是转成了无符号数进行比较的, 比较左边unsignted int应该比右边带符号数的大, 第二个问题是转成了int都是有符号数了 第三个问题是应该是相等的 10000000-1==01111111 理解这种问题需要知道的是: 高级...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 444
精华内容 177
关键字:

无符号数的运算规则