unsigned y = ;
int x = -;
cout << x + y << endl;

对于上述的结果为

这里面有一个负数的补码问题和不同类型之间的隐式类型转换问题

首先负数的表示方法是负数的绝对值的二进制码取反再加1,-2的补码计算就是:

0000 0000 0000 0010->1111 1111 1111 1101->1111 1111 1111 1111 1110

而整数的加减在内部都是通过加运算实现的,主要原因是使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

1的二进制表示是:0000 0000 0000 0001

x + y在内部的二进制表示就是1111 1111 1111 1111

对于最后的类型又有一个隐式类型转换的规则,两个通用的指导原则如下:
    1、为防止精度损失,如果必要的话,类型总是被提升为较宽的类型。
    2、所有含有小于整形的有序类型的算术表达式在计算之前其类型都会被转换成整形。

一般来说各种类型的转换顺序为 long double > double > float >=  int >= short > char,unsigned > signed 。

由于unsigned > signed,所以x+y被解释为unsigned,最后输出值就是2的32次方减一

int取值范围

-2^31 ~ 2^31-1

为什么负数是 -2^31 而不是-2^31-1呢?

因为规定了1000 0000, 0000 0000, 0000 0000, 0000 0000这个特殊的数(本来是-0的)为-2^31,所以负数就多一个

同理char类型的取值范围为-128到127,在这里也是把1000 0000表示为-128

c++ int 负数 补码 隐式类型转换的更多相关文章

  1. dynamic_cast 和 static_cast 隐式类型转换的区别

    首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况:1) 算术转换(Arithmetic conversion ...

  2. c++ operator操作符的两种用法:重载和隐式类型转换,string转其他基本数据类型的简洁实现string_cast

    C++中的operator主要有两个作用,一是操作符的重载,一是自定义对象类型的隐式转换.对于操作符的重载,许多人都不陌生,但是估计不少人都不太熟悉operator的第二种用法,即自定义对象类型的隐式 ...

  3. C++的隐式类型转换与转换操作符

    C++标准允许隐式类型转换,即对特定的类,在特定条件下,某些参数或变量将隐形转换成类对象(创建临时对象).如果这种转换代价很大(调用类的构造函数),隐式转换将影响性能.隐式转换的发生条件:函数调用中, ...

  4. C++的隐式类型转换

    C++是一种复杂的语言,其中有许多“好玩”的特性,学习C++的过程就像在海边捡一颗颗石头,只要坚持不懈,也许一颗颗小石头也能建起你自己小小的城堡. 废话完后,讲讲自己捡到的石头:隐式类型转换 学习出处 ...

  5. 【M21】利用重载技术避免隐式类型转换

    1.考虑UPint 的加法+,UPint a, b, result; 为了使result = a+10; result= 10+a; 都能通过编译,操作符重载如下: const UPint opera ...

  6. Mysql隐式类型转换原则

    MySQL 的隐式类型转换原则: - 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换 ...

  7. 深入js隐式类型转换

    前言 相信刚开始了解js的时候,都会遇到 2 =='2',但是 1+'2' == '1'+'2'为false的情况,这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这 ...

  8. operator用法:隐式类型转换

    operator它有两种用法,一种是operator overloading(操作符重载),一种是operator casting(操作隐式转换). 1.操作符重载C++可以通过operator实现重 ...

  9. C++ 中operator用法:隐式类型转换

    [转]C++ operator两种用法 C++,有时它的确是个耐玩的东东,就比如operator,它有两种用法,一种是operator overloading(操作符重载),一种是operator c ...

随机推荐

  1. 如何制作 Ubuntu 系统的 USB 启动盘

    下载 Ubuntu 打开 http://mirrors.ustc.edu.cn 获取安装镜像 --> 获取 ISO 刻录 Ubuntu 到 U 盘 打开 http://rufus.akeo.ie ...

  2. 使用Goland同步远程代码

    新版本的goland貌似已经有了Deployment功能,故本篇文章描述的方法也不推荐使用了 以前写php时候习惯使用phpstorm这个编译器,除去本身功能强大不说,比较方便的是其自身带的Deplo ...

  3. 网易云音乐API

    网易云音乐API使用 封装了一些api调用 ZZRRegion/StNetease

  4. fedora19之后的版本安装mysql

    正准备学习linux平台的mysql,却发现在fedora21平台下安装mysql总是失败,查了些资料,总结如下: 错误示范: 按照安装软件的经验,习惯性输入以下的命令: $sudo dnf inst ...

  5. Java设计模式(5)——创建型模式之建造者模式(Builder)

    一.概述 概念 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示.(与工厂类不同的是它用于创建复合对象) UML图   主要角色 抽象建造者(Builder)——规范建造方法与结果 ...

  6. MyBatis-MBG(MyBatis Generator)

    1.添加jar包 <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>m ...

  7. Qt 独立运行时伴随CMD命令窗口

    用Qt写了一个小软件,在把程序release后,打包分装后,发现程序运行的时候会伴随cmd命令窗口,可把我愁怀了 不过功夫不负有心人,在老师和我网友的帮助下,终于搞完了 CONFIG:指定工程配置和编 ...

  8. Git版本库工作流程图想

    对照廖雪峰的教程,发现有很多难以理解的地方,画了一个图想方便以后参考 首先两个基本命令反应了版本库最本质的工作流程,后面的命令其实都基于此git add 把文件修改添加到暂存区git commit 在 ...

  9. JavaScript 常用控制流程代码范例

    if-else 的用法 var a = 33 if (a == 1){ console.log ('a等于1') } else if (a==2) { console.log ('a等于2') } e ...

  10. 使用bing或google来翻译网页

    google代码:在</head>之后插入 <meta name="google-translate-customization" content="4 ...