/*
* 最近在读取文件的时候用到了c++里面的seekg(fstream::off_type, fstream::seekdir),
* 很自然的调用seekg(-str.size(), fstream::cur);结果悲剧了,文件指针却向前移动很多个
* 字节。纠结了半天,改调用为seekg(-(int)str.size(), fstream::cur),指针移动正常。
* 可是为什么会这样呢??想必读者也会困惑吧!这里面其实跟c语言的自动类型转换有关。
* 首先,借用一个网上一道面试题:
* ***********************************************************************************
* unsigned int a = 4;
* int b = -20;
* if(a + b > 4)
*     cout << "a + b > 4";
* else cout << "a + b <= 4"; 
* 结果输出为:a + b > 4
* 解释就是:无符号与有符号参加运算时,有符号类型会自动转换为无符号类型。也就是说b与a
* 做加法时,b自动转换为无符号类型,就是一个非常大的正数。结果a+b当然也是个很大的正数。
* ***********************************************************************************
* 回到我们的问题,seekg(-str.size(),fstream::cur)中,str.size()返回类型是
* string::size_type,其实就是unsigned int类型。当与-1做乘法时,-1就被临时转化为unsigned 
* int类型,十六进制表示就是0xffff,结果就相当于(0xffff)*str.size(),这个结果当然是个很
* 大的正数。所以在函数调用之后,文件指针向前移动了很多个字节。
* 另外再做一下说明:
* long long test1 = -str.size();
*      int  test2 = -str.size();
* test1 和 test2 结果是不一样的,test2返回的逻辑上正确的负数,
* test1 返回的是大正数,自己根据补码想一想就知道了。
*
* 附上测试代码......
*/
#include <iostream>
#include <fstream>
#include <bitset>
#include <string>

using namespace std;

int main()
{
    unsigned int a = 4;
    int b = -20;
    cout << "binary(a) = " << bitset<32>(a) << endl;
    cout << "binary(b) = " << bitset<32>(b) << endl;
    if(a + b > 4)
    {
        cout << "a + b = " << a + b << " #a+b>4" << endl;
    }
    else cout << "a + b = " <<    a + b << "#a+b<4" << endl;

bitset<32> bs(a + b);
    cout << "binary(a + b) = "<< bs << endl;

int test1 = a + b;
    cout << "test1 = " << test1 << endl;
    bitset<32> bs2(test1);
    cout << "binary(test1) = " << bs2 << endl;

long long test2 = a + b;
    cout << "test2 = " << test2 << endl;
    bitset<64> bs3(test2);
    cout << "binary(test2) = " << bs3 << endl;

return 0;
}

转载于:https://blog.51cto.com/hustluy/1031222

自动类型转化的鲜为人知的陷阱相关推荐

  1. java赋值运算的类型转换出新的问题_Java中byte、short、char、int、long运算时自动类型转化问题...

    -------------------------------------------------------------------------------------------------- ★ ...

  2. c语言自动转化,C语言编程之自动类型转化

    咱们在写程序的时候经常会遇到一些不好找的bug,有的并不是很难,只是大家容易忽略,今天咱们就来看一个,关于C语言自动类型转换的bug. 先看一段代码: void getNext(int * next, ...

  3. c语言编程车,C语言编程之自动类型转化

    咱们在写程序的时候经常会遇到一些不好找的bug,有的并不是很难,只是大家容易忽略,今天咱们就来看一个,关于C语言自动类型转换的bug. 先看一段代码: void getNext(int * next, ...

  4. [C++对象模型][10]类型转化

    一 typeid与dynamic_cast 1)RTTI, Runtime Type Identification (RTTI) or Run-time type information (RTTI) ...

  5. 《Effective Modern C++》翻译--条款2: 理解auto自动类型推导

    条款2: 理解auto自动类型推导 如果你已经读过条款1关于模板类型推导的内容,那么你几乎已经知道了关于auto类型推导的全部.至于为什么auto类型推导就是模板类型推导只有一个地方感到好奇.那是什么 ...

  6. R语言实现GWAS结果显著SNP位点归类提取与变异类型转化

    GWAS结果显著SNP位点归类提取与变异类型转化 根据GWAS得到的Rresult文件信息,能够找出每个snp位点对应的显著性情况和基因变异信息,接下来,需要根据表格中的信息进行归纳总结,对不同显著性 ...

  7. 【Groovy】Groovy 动态语言特性 ( Groovy 中函数实参自动类型推断 | 函数动态参数注意事项 )

    文章目录 前言 一.Groovy 中函数实参自动类型推断 二.函数动态参数注意事项 三.完整代码示例 前言 Groovy 是动态语言 , Java 是静态语言 ; 本篇博客讨论 Groovy 中 , ...

  8. 【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )

    文章目录 前言 一.Groovy 动态语言 二.Groovy 中的变量自动类型推断及动态调用 三.Java 中必须为变量指定其类型 前言 Groovy 是动态语言 , Java 是静态语言 ; 一.G ...

  9. Java的知识点6—— 强制类型转换、基本类型转化时常见错误和问题、 简单的键盘输入和输出

     强制类型转换 强制类型转换,又被称为造型,用于显式的转换一个数值的类型.在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出. public class Test2 {pu ...

  10. auto自动类型推断

    文章目录 1 auto 1 auto auto在C++11之前是自动变量的含义(栈变量,局部变量),在C++11后赋予其新的作用:自动类型推断. auto可以在声明变量的时候根据初始值的类型自动为此变 ...

最新文章

  1. 如何拯救收录直线下滑的网站?
  2. 日记:2019-07-28
  3. Yarn框架和工作流程研究
  4. fillstyle属性_html设置或返回用于填充绘画的颜色渐变或模式的属性fillStyle
  5. 对自学还是培训的看法
  6. 牛客题霸 [数组中未出现的最小正整数] C++题解/答案
  7. Hive关于数据表的增删改(内部表、外部表、分区表、分桶表 数据类型、分隔符类型)
  8. ubuntu16.04 + kinetic +turtlebot2配置
  9. linux第三方模块参数,nginx 的第三方模块ngx_http_accesskey_module 来实现下载文件的防盗链步骤(linux系统下)...
  10. linux php 源码安装,Linux下PHP的源码安装与配置
  11. 软件从“出生”到“消亡”的过程称为_软件测试面试最常问到的101个面试问题,你中枪了吗?(一)...
  12. linux 黑苹果 win7双系统,学习笔记:安装黑苹果和win双系统(基础篇)
  13. Java指定屏幕区域截屏
  14. c语言编程多项式,多项式c语言编程.docx
  15. 景区环境监测系统监测天气与客流量
  16. 更好的在小学语课上用计算机,如何把小学科学课上好教育随笔
  17. 菜狗为了打败菜猫,学了一套如来十三掌
  18. 最优化:拟牛顿法、最速下降法、共轭梯度法、信赖域法、协同优
  19. 变换Transformation(1)(笔记)
  20. 怎样在Word文档中插入GIF动画

热门文章

  1. PAIP.java程序调试的注意点及流程总结
  2. PAIP.国内软件公司的现状及解决.txt
  3. 酒后谈IT,那些术语大妈都能秒懂!
  4. 彼得.泰尔:认知未来是投资人的谋生之道
  5. (转)比特币的挖矿的难度
  6. 制造业升级智造业,阿里云提炼了9大场景
  7. 在中国在行其道的智慧城市,为何折戟多伦多? | 凌云时刻
  8. 【优化算法】白冠鸡优化算法(COOT)【含Matlab源码 1795期】
  9. 【数字信号调制】基于matlab GUI PCM编码+QAM调制【含Matlab源码 1095期】
  10. 计算机学院篮球赛主题,计算机学院称雄中国科大2011年学生篮球赛