今天答题中遇到个经典的 long long 运行 异常的求助题。由此我们来引申到隐式转换需要主要的一些问题。

先把这题目拿来看看。
原题目:
计算1+2+3+·······+n (1<=n<=1,000,000,000)

将1,000,000,000作为下面两个程序的输入

#include
using namespace std;

int main(int argc, char *argv[]) {
long n; //问题在这里
long long sum=0;
cin>>n;
sum=(1+n)*n/2;
cout<<sum;
return 0;
}

结果是错的,出现的结果是 -243309312,想要得到的结果是500000000500000000。
什么原因呢?
首先说明下,long 类型 不会自动转换为long long 类型,long long 类型是C99标准增加的新的类型,不在隐式转换的范畴内。
所以当n为long 类型时 ,右侧数据计算出的结果还是以long类型存储,500000000500000000 对应的 0x06f05b59f17f6500,右边数据溢出被截取保留低4个字节,即0xf17f6500; 此时最高为为1,故为负数,赋值给longlong类型后,高4字节每位会被填充1,即sum = 0xfffffffff17f6500 . 对应的十进制数即为-243309312

那我们在贴上隐式转换的经典代码

int main(int argc, char *argv[]) {char a = 0x80;int b =0;short int ssi = 0x7fff;  //短整型有符号数最大值int si = ssi * ssi;    ///此处右侧计算会溢出吗long  n = 1000000000;long long ll = (1+n) * n /2;b = a * a ;cout << b<<endl;printf("a:%d,%d\n", b, a);cout << "si" << si << endl;cout << "ssi" << ssi << endl;cout << "long" << n << endl;cout << "Long long" << ll << endl;cout << "sizeof(shorte int)" << sizeof(short int) << endl;cout << "sizeof(int)" << sizeof(int) << endl;cout << "sizeof(long) :" << sizeof(long) << endl;cout << "sizeof(longlong)" << sizeof(long long) << endl;return 0;
}

此处和上例做了一个对比,其中整形 si = ssi * ssi; ssi 为有符号短整型最大值,右侧程式得到的结果肯定大于两个字节,但是si最终结果却为正值,和上例不一样的地方。这就涉及到隐式转换中的赋值转换。

赋值转换:
c语言中.如果赋值运算符两侧都是数值型数据或都是字符型数据,那么在赋值过程中会进行自动类型转换,转换的规则归纳如下。
(1)若将整型数据赋值给单精度或双精度的浮点型变量时,系统自动将整型数据转换为单精度或双精度数据(数值不变,但以浮点数形式存储到变量中)。
(2)若将单精度或双精度的浮点型数据赋值给整型变量时,系统自动将浮点型数据取整转换为整型(舍弃浮点型数的小数部分进行取整)。
(3)若将字符型数据赋值给整型变量时,由于宁符型数扔只占一个字节.而整型数据占两个字节,因系统将字符型数据放入整型变量的低八位中,整型变量的高八位则根据第八位决定在高八位补1或补0。
例如char a = 0x80;
int b = a;
b 的值等于0xffffff80。

还有一点隐式转换的地方,关系表达式中也会隐式转换。来一道经典的面试题。

unsigned int a = 10;
int b = -20;(a + b > -6) ? puts("> -6") : puts("<= -6");   //<=-6
(a + b > 6) ? puts("> 6") : puts("<= 6");    //>6

输出结果为:
<= -6

6;
都是转换成无符号数后进行比较,所以结果这样。
最后我们上一张经典的隐式转换图作为本章的结束。

从long long 谈类型转换相关推荐

  1. JavaSE笔记(二)Java对象和多态

    Java对象和多态 (面向对象) 面向对象基础 面向对象程序设计(Object Oriented Programming) 对象基于类创建,类相当于一个模板,对象就是根据模板创建出来的实体(就像做月饼 ...

  2. java本质_Java深入解析 透析Java本质的36个话题_源雷技术空间

    资源名称:Java深入解析  透析Java本质的36个话题 内容简介: 本书分为5 章,分别为"基本概念","运算符与表达式","String 类&q ...

  3. java中的强制类型转换注意事项_浅谈Java中强制类型转换的问题

    为了更好的理解我们先看下面的例子: package com.yonyou.test; import java.util.ArrayList; import java.util.Iterator; im ...

  4. Java程序员从笨鸟到菜鸟之(四十四)细谈struts2(七)数据类型转换详解

     本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 Web应用程序的交互都是建立在HTTP之上的,互相传递的都是字符串.也就是说服务器接收到 ...

  5. python数据类型转换原因_浅谈Python数据类型之间的转换

    Python数据类型之间的转换 函数 描述 int(x [,base]) 将x转换为一个整数 long(x [,base] ) 将x转换为一个长整数 float(x) 将x转换到一个浮点数 compl ...

  6. 【C++】浅谈强制类型转换(4种)

    文章目录 01.C风格类型转换 02.C++ 四种强制转换类型函数 2.1. static_cast 2.2. const_cast 2.3. reinterpret_cast 2.4.dynamic ...

  7. 浅谈Python中的类型转换

    目录 (一)前言 (二)四种常见转换类型 1. int()函数 (1)int()函数的格式 (2)示例 2. float()函数 (1)float()函数格式: (2)示例 3. str()函数 (1 ...

  8. 浅谈javascript数值类型转换

    又是一个小小的知识点,不知你们在开发中是否会用到,碎片时间,学起来.... 数值转换:Number().parseInt().parseFloat()的差异. Number(): Boolean:tr ...

  9. python中内置的四种数值类型为_浅谈python语言四种数值类型

    Python语言支持四种不同的数值类型,包括int(整数)long(长整数)float(浮点实际值)complex (复数),本文章向码农介绍python 四种数值类型,需要的朋友可以参考一下.希望对 ...

最新文章

  1. SVG(H5可缩放的矢量图形)
  2. 【效率】又来一个Windows神器!!!
  3. [LeetCode] Binary Tree Paths - 二叉树基础系列题目
  4. TIOBE 11月编程语言排行:Java首次跌出前二,Python 势不可挡。
  5. js把日期字符串转换成时间戳
  6. css清除浮动的原理
  7. HP-UX下做磁盘镜像
  8. 聚类分析在用户行为中的实例_基于行为数据的消费信贷反欺诈方案
  9. 2018-2019 ACM-ICPC, Asia Shenyang Regional Contest题解
  10. 软件测试周刊(第24期):最不重要的素质就是智商
  11. H5中的video标签使用
  12. 第三届“马栏山杯” 国际音视频算法大赛
  13. 热搜第一!中国烟草总公司工资曝光,员工人均年收入超18万元!网友:简直是不锈钢饭碗!...
  14. 中青网财经:请一位心理学博士当CTO 只有马云敢这么做
  15. 苹果VS谷歌,开战了?
  16. gom列表自动选择服务器,GOM纯微端服务器如何设置
  17. 小程序为什么要办理ICP增值电信业务经营许可证
  18. 微服务之服务治理相关内容
  19. 软件测试流程有哪些?
  20. Libtool library used but LIBTOOL is undefined

热门文章

  1. Java新生代 与老生代
  2. python怎么通过手机号定位_python通过手机号获取微信男女性别
  3. SOD下载数据注意事项
  4. bat批处理脚本入门
  5. 什么是欧式期权?什么是美式期权?
  6. ARM Linux对signal的处理过程
  7. 利用baostock获取上市公司财务指标
  8. MySQL基础学习③数据库准备工作,导入官方employees数据库
  9. web前端开发发展史,前后30年,展望未来!
  10. 腾讯企业 html邮件模板,用腾讯企业邮做为邮件服务器来发送通知邮件的操作步骤...