C++中含有无符号类型的表达式——有符号数与无符号数相加
首先,明确一个概念,什么是有符号数,什么是无符号数。以整型为例,int 类型的既可以表示正整数,又可以表示负整数,所以是有符号数。unsigned int 只可以表示正整数,所以成类似的数为无符号数。在计算机表示中,无符号数的所有位数都表示该数的大小。有符号数的最高位表示正负,0表示正1表示负。例如,
无符号数 1111 1111 表示的数为十进制 255
有符号数 0111 1111 表示的数为十进制127
在编程中,我们不会刻意把无符号对象赋一个负数,但是实际中,很容易写出这样的代码。先看下面的程序:
#include <iostream>
using namespace std;int main()
{int i = -42;unsigned u = 10;cout << i + i << endl;cout << u + u << endl; cout << i + u << endl;
}
第一、二个输出语句分别是 -84 ,20是没问题的,但是,第三个输出语句是-32吗?显然不是!是4294967264,这是为什么呢?
实际上,在一个算数表达式中既有无符号数又有有符号数,那个有符号数(本例中是 int )就会变成无符号数,-42 就会变成无符号数。把负数转成无符号数,结果等于这个负数加上无符号数的模。什么意思呢?在 VS2013编译器中(int 类型变量占4个字节),2的32次方 = 4294967296,那个-42 变成无符号数为 4294967254,再加上10,结果就是我们看到的 4294967264。如下图。
那么,两个无符号数相减呢?看下面几行代码:
#include <iostream>
using namespace std;int main()
{unsigned u1 = 10, u2 = 42;cout << u2 - u1 << endl; cout << u1 - u2 << endl;return 0;
}
输出结果如下:
在C++ 中,一个无符号数减去一个值,无论这个值是不是无符号数,都要保证得到的结果不能出现负数。如果是负数,就要加上无符号数的模。本例中,-32 + 4294967296 = 4294967264.
肯定有人很费解。其实弄懂计算机存储数据的机制,就没问题了。下面介绍原码、补码和反码
原码:一个整数,按照绝对值的大小以二进制的形式表示出来,最高位为符号位(0表示整数,1表示负数)
反码:将原码按位取反(最高位除外)。显然,正数的补码等于原码。
补码 : 将反码最低位加1即为补码
有人更费解了,为什么要使用补码呢。其实补码的优势非常明显:
(1)、负数的补码与对应正数的补码之间的转换可以用同一种方法-求补运算完成,可以简化硬件。
(2)、可将减法变为加法,这样减法就可以用加法器进行计算了。
(3)、两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
最后,给大家提供一个大神求补码算法,快速求补码
从最低位开始至找到的第一个1均不变,符号位不变,这之间的各位“求反”(0变1;1变0)。
比如,原码:1010 1001 补码:1101 0111
C++中含有无符号类型的表达式——有符号数与无符号数相加相关推荐
- C语言学习笔记-有符号数和无符号数相加的问题
Q: 下面的代码输出是什么,为什么? void test(void) {unsigned int a = 6;int b = -10;((a + b) > 0) ? printf("a ...
- 关于汇编中有符号数和无符号数的判断
首先给一段代码 1 #include <stdio.h> 2 int main() 3 {unsigned int x=9; 4 int y=-20; 5 int m=(x+y> ...
- c语言中的无符号字节,C语言之有符号数和无符号数
我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时 ...
- C语言中的有符号数和无符号数之间转换
C语言中的有符号数和无符号数之间转换 我们都知道C语言中有有符号数和无符号数两种整数表示方法,并且支持相互转换. 那么具体相互转换有什么规则,我们今天来了解一下: 在C语言中当声明一个像12345或0 ...
- 【转+】C中的有符号数和无符号数之间的转换
1. 在C语言中,数字常量如果没有后缀'U'或'u',则默认为是有符号数. 例: 其中1024和oxff这两个常量都是有符号数,这就意味着每个赋值操作包含了一个隐式的由有符号数到无符号数的类型转换. ...
- C中的有符号数和无符号数之间的转换
1. 在C语言中,数字常量如果没有后缀'U'或'u',则默认为是有符号数. 例: [cpp] view plaincopy unsigned int n = 1024; unsigned int m ...
- 各种类型sizeof大小及C++有符号数与无符号数进行比较
不同类型sizeof相关: class A {}; class B { char m_data;}; class C {char m_data[100]; }; class D {char* m_da ...
- C语言中 有符号数、无符号数、整数溢出
#include<stdio.h> void main() {int l=-1;unsigned int c=135; printf("%u\n",l+c); } 这个 ...
- FPGA设计中 有符号数、无符号数
FPGA设计中 有符号数.无符号数 今天给大侠聊一聊FPGA设计中有符号数以及无符号数,话不多说,上货. 在设计中,所有的算数运算符都是按照无符号数进行的.如果要完成有符号数计算,对于加.减操作通过补 ...
最新文章
- Jeff Dean竟在谷歌成众矢之的!开除“论文不合格”AI伦理研究员,被1400名员工批斗...
- numpy版本不对应导致tensorflow出错
- 【CyberSecurityLearning 31】Linux网络信息查看与配置、日志文件的管理、备份及日志服务器的搭建
- step3 . day3 数据结构之线性表 单项循环链表和双向循环链表
- 微信小程序开发系列六:微信框架API的调用
- PowerDesigner的汉化破解安装到逆向工程(ORACLE)
- SLS多云日志采集、处理及分析
- c#和java_C#和Java接口对比
- Spring的IOC容器为什么用反射而不用new来创建实例?
- phpcms v9 在当前栏目下获取父栏目与当前栏目的名称与连接
- AI编辑SVG格式的相关问题
- String 截取字符串#中间的文本
- FisherYates费雪耶兹随机置乱算法
- 浏览器配置异常_IE浏览器异常 修复/重置ie设置方法
- multisim14安装后怎么汉化(超详解)
- k8s部署prometheus的相关配置
- 初学者学Python必看的几个练手小项目,轻松不枯燥哦
- ipad iphone开发_如何从iPhone或iPad连接到Windows远程桌面
- 苹果app调试流水账
- 商场三十六计——第22计 “关门捉贼”