精华内容
下载资源
问答
  • 本文介绍了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语言无符号数与有符号数运算原则,一些容易踩坑的点
    int main(void)
    {
    	for (int i = -1; i < sizeof(int); i++) {
    		printf("%d\n", i);
    	}
    	return 0;
    }
    

    啥都不输出,因为:

    1、sizeof()返回的是unsigned int类型

    2、有符号数与无符号数进行运算时,有符号数先自动转换成无符号数

    因此"i < sizeof(int)"比较时-1会转换成unsigned int类型,溢出到unsigned int的最大值,导致大于sizeof(int)
     

    int main(void)
    {
    	unsigned int a = 6;
    	int b = -20;
    	int c = a + b;
    	printf("b = %u\n", b); // b = 4294967276
    	printf("a + b = %u\n", a + b); // a + b = 4294967282
    	printf("a + b = %d\n", a + b); // a + b = -14
    
    	if ((a + b) > 0) {
    		printf("a + b > 0\n"); // a + b > 0
    	} else {
    		printf("a + b <= 0\n");
    	}
    	
    	if (c > 0) {
    		printf("c > 0\n");
    	} else {
    		printf("c <= 0\n"); // c <= 0
    	}
    	return 0;
    }
    

    1、a+b,b要转为无符号,即4294967276,可以理解为无符号下-20,

    再加a就是4294967282,即ffff fff2,可以理解为无符号下-14,因此输出回%d有符号十进制就是-14

    2、a+b的值是ffff fff2,肯定大于0,所以输出a + b > 0

    3、c是int类型有符号整数,所以同%d输出一样,无符号下-14值转有符号十进制是-14,所以c小于0
     

    int main(void)
    {
    	signed short i = 65535;
    	printf("%d\n", i);
    	return 0;
    }
    

    i为-1。因为short占2字节,所以是16位,

    short最大值为0111 1111 1111 1111,为32767

    short最小值为1000 0000 0000 0000,首位为符号位,1代表负数所以得转为原码

    首位符号位取反,其余所有位也取反后最后一位加1

    即0111 1111 1111 1111 + 1 = 1000 0000 0000 0000即32768,所以该负数的原码为32768,该负数为-32768

    65535比32767溢出32768,而溢出1就是-32768,因此溢出32768偏移32767就是-32768+32767=-1。
     

    总结,无符号数与有符号数的运算原则如下:

    1、参与运算的类型不同,会自动转换成相同类型再运算。

    2、转换的方向为向数据长度增长的方向,char->short->int->unsigned int ->long

    3、所有float都会先转成double进行运算,哪怕只有一个float

    4、赋值运算时,赋值号右边的类型向左边的类型转换。

    5、浮点数和整形数,整形数向浮点数转换。

    6、在表达式中,如果char和short类型的值进行运算,无论char和short有无符号,结果都会自动转换成int。

    7、如果char或short与int类型进行计算,结果和int类型相同。即:如果int是有符号,结果就是带符号的,如果int是无符号的,结果就是无符号的。

    展开全文
  • 符号数无符号数之间的运算

    千次阅读 2017-08-17 21:16:58
    在C/C++中,经常可能会涉及到一个无符号数与一个有符号数之间的运算。其实这个问题是关于C/C++语言中的整数自动转换原则:当表达式中存在有符号类型和符号类型时所有的操作数都自动转换为符号类型。因此,从这个...

    在C/C++中,经常可能会涉及到一个无符号数与一个有符号数之间的运算。其实这个问题是关于C/C++语言中的整数自动转换原则:当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此,从这个意义上讲,无符号数的运算优先级要高于有符号数。

    如:

    例子1:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int main()
    {
    	unsigned int a=20;
    	signed int b=-130;
    	if(b>a)
    	  cout<<"yes"<<endl;
    	else
    	  cout<<"no"<<endl;
    	cout<<a+b<<endl;
    	return 0;
    }

    结果输出:

    yes!!

    4294967186

    其实,在运算之前,a=20,b被转化为4294967166,远远大于a。因此,不论是a和b之间加减运算还是乘除运算,有符号数总是先要转化为无符号数再进行与无符号数运算。


    例子2:

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    int main()
    {
    	unsigned short int a=20;
    	signed  short int b=-130;
    	cout<<a+b<<endl;
    	if(a<b)
    	  cout<<"yes"<<endl;
    	else
    	  cout<<"no";
    	
    	return 0;
    }
    运行结果为:

    -110

    no
    注意:signed short int 与 unsigned short int之间运算时,有符号数并没有先转化为无符号数再运算!!


    而对于浮点数来说,浮点数(float,double)实际上都是有符号数,unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数根无符号数之间转化的问题了。



    参考:http://www.52rd.com/Blog/Detail_RD.Blog_lentil_13982.html?WebShieldDRSessionVerify=FUjFZscItta2SWTIpihz


    展开全文
  • 一、无符号数 无符号数二进制的乘除,就相当于左移或者右移了 2的几次方倍(如下图...【注意】无符号数小数减大数,结果出现负数,但是无符号数本身取值范围是≥0的,所以只能是其补码运算结果输出值为真值。 其中小数.
  • 符号数无符号数之间运算问题

    万次阅读 2016-02-03 23:03:26
    //7中:u-i2,该表达式中u是无符号数,i2是有符号数运算时先将i2转为补码形式(因为是i2为正数所以数值不变),所以u-i2=10-42=-32,而显然表达式的结果必须是无符号数,所以-32就隐式转为无符号数(补码形式的数值...
  • 计算机组成-无符号数乘法

    万次阅读 2018-08-17 10:02:08
    下面是C语言编写的一个乘法子程序,实现两个16位无符号数相乘,结果为32位无符号数。 unsigned int mul16(unsigned int x, unsigned int y){ unsigned int a,b,c; unsigned int i; a=x; b=y; c=0; f...
  • 符号数无符号数详解(2)补码详解1. 为什么需要补码1.1 背景2 补码的思想2.1 我们希望只设计加法运算器,不用减法运算器。2.2 现在问题是:怎么表示-1呢?3. 补码3.1 补码的优点3.2 例子:4. 补码的本质:参考 1...
  • 符号数无符号数运算

    千次阅读 2015-03-31 16:29:51
    符号数无符号数运算规则如下: 表达式中既有无符号数又有有符号数,则有符号数会自动转换为无符号数,然后进行计算。such as: int i; unsigned j; cout ; 首先将i自动转换成无符号数,然后与j相加,输出...
  • C语言中的自动类型转换: 在C语言中,进行混合运算时,编译系统遵循一定规则,完成数据类型的自动转换...所以,无符号数与有符号数进行运算时,先需要将有符号数转化为无符号数进行操作。以下代码所展示出的结果,...
  • "如果一个运算对象是无符号类型,另外一个运算对象是带符号类型,而且其中的无符号类型不小于带符号类型,那么带符号运算对象转换成无符号的。" 实验代码: int a = -5; unsigned c = 3; //这里unsigned有4个...
  • 无符号数和有符号数 前言 第一篇学习了计算机组成原理的核心,冯诺依曼结构。由于确实没学好,就不从头开始学了。这一篇开始学习计算机的运算方法。首先来学习无符号数和有符号数。基本就是学习基本概念,然后提出...
  • 1、有符号数无符号数之间运算问题  以下实验均在virual c++6中运行通过  这个问题测试是否懂得C语言中的整数自动转换原则,有些开发者懂得极少这些东西。当表达式中存在有符号类型和符号类型时 所有的操作数...
  • 需要了解的知识 1.原码、补码 2.计算机寄存器和内存进行运算的存储方式 ...无符号数与有符号数进行运算时,有符号数将被看作无符号数 原码与补码 正数的补码是原码,负数的补码是绝对值的原码取反加一 ...
  • 有/无符号数加减法

    2021-07-23 09:41:22
    有符号数和无符号数运算的位扩展 当所有操作数和结果数据位宽一样时,有符号数和符号数所产生的运算电路是一样的。 当所有操作数和结果数据位宽不一样时,符号数进行0扩展,而有符号数进行符号扩展。 在verilog...
  • C语言是允许有符号数无符号数相互转换的,遵从的规则就是我们刚刚介绍过得T2U和U2T的规则。 但是C语言中如果有符号数无符号数进行运算时,系统会默认将有符号数转换成无符号数来进行运算。因此,有些时候有些...
  • 转载于:https://my.oschina.net/AARONWB/blog/1550957
  • 符号数赋值 位宽截断  位宽大的数赋值给位宽小的数,数据就会被截断,截断的规则就是从低位开始取,被截断的是高位 code wire [5:0] a; wire [4:0] f; localparam data1=5'b11001, data2=5'b11010; ...
  • 补码和无符号数

    千次阅读 2020-03-28 15:15:24
    无符号数和有符号数之间的转换 不同字长间的转换 整数运算 乘以常数
  • 当执行一个运算时,如果它的一个运算数是有符号的而另一个是符号的,那么C会隐含地将有符号参数强制类型转换为无符号数,并假设这两个数都是非负的,来执行这个运算。 请看如下代码并判断输出结果: #include...
  • 无符号数文法规则可定义如下: <无符号数>→<符号实数>|<符号整数> <符号实数>→<符号整数>.<数字串>[E<比例因子>]|<符号整数>E<比例因子> <比例因子>→<有符号整数> <有符号整数>→[+|-]<符号整数> <...
  • 1. 有符号数无符号数 无符号数,因为没有符号位,所以只能表示一个正数。 有符号数,因为存在符号位,符号位如果是0的话,代表这是一个正数,符号位如果是1的话,代表这个数是一个负数。   我们可以用db伪...
  • 无符号二进制的算术运算

    万次阅读 2019-02-24 19:50:16
    一、无符号二进制运算规则: 无符号二进制的加、减、乘、除四则算数运算法则其实与十进制的四则算数运算法则是一一对应的。如果你理解了十进制的四则算数运算法则,那么理解无符号二进制的四则运算相对来...
  • 无符号数取反

    2021-05-27 11:39:09
    无符号数取反的规则是: 例如:-2的二进制补码表示是:11111111111111111111111111111110 将其强制转换为unsigen int型11111111111111111111111111111110,对应值为4294967294。 将该无符号数取反:2^32-...
  • 符号数无符号数的转换及思考

    万次阅读 多人点赞 2016-09-16 21:00:51
    1 有符号数无符号数的表示三者的最高位均为符号位.我以前一直没弄明白的是为何8位补码的表示范围是-128~127, 今天查阅了相关资料,于此记下。仍然以8位为例:原码原码的表示范围-127~-0, +0~+127, 共256个数字。正...
  • 本文详尽介绍了利用verilog实现带进位加法和减法器的方法,和overflow的实现,适用性很广,特别是在处理器如MIPS的设计当中。
  • 符号数无符号数

    千次阅读 2018-10-01 22:31:55
    专题:汇编语言中有符号数还是无符号数? 一、汇编语言在存储方面讲,有符号数无符号数存储形式是一致的。 l 数据在内存或CPU的寄存器中都是按照有符号数的二进制补码方式存储的。  例如(在debug中测试): ...
  • 符号数无符号数在一起进行运算时,要首先将有符号数转换为无符号数,再进行运算。 整型常量。 [cpp] view plain copy unsigned int n = 1024;  unsigned int m = 0XFF;  其中1024和oxff这...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 221,509
精华内容 88,603
关键字:

无符号数的运算规则