long a=100; long a=100L; long a=(long)100;三种写法有区别吗
考据党,我来翻翻标准……参考标准:C99(ISO/IEC 9899:1999)C11(ISO/IEC 9899:2011)C++11(ISO/IEC 14882:2011)C99 6.4.4.1 Integer constantsC11 6.4.4.1 Integer constants整型常量的类型是在下表中能表示它的值的第一个类型。
C++11 2.14.2 Integer literals整型常量的类型是在表6中能表示它的值的第一个类型。
(两张表一样的)C99 5.2.4.2.1 Sizes of integer types \u0026lt;limits.h\u0026gt;C11 5.2.4.2.1 Sizes of integer types \u0026lt;limits.h\u0026gt;实现定义的值的绝对值应当大于等于下列值,且带有相同符号。int的最大值:INT_MAX +32767long int的最大值:LONG_MAX +2147483647显然,在这里100是必定能够被int和long int表示的。所以整数常量“100”的类型应当为int,“100L”的类型应当为long int。C99 6.3.1.3 Signed and unsigned integersC11 6.3.1.3 Signed and unsigned integers当一个整数类型的值被转换为另一个非_Bool的整数类型的值,如果这个值能被新的类型所表示,那么它不会改变。100能被long int表示。隐式转换显式转换什么的就不用说了。所以如果编译器符合标准,那么最终a的值都一定是100。至于优不优化是编译器的事,标准管不着。(当然这种程度的优化编译器肯定能做)
■网友
没有区别。当类型是基本类型,并且值是立即数时,无论怎么写,全都是在编译期完成,生成的代码没区别。仅仅当100是个变量而非立即数的情况下才会有区别。
■网友
没有区别。第一种情况有隐式转换,第三种是显式转换。恕我直言,不能将这种转换优化掉的编译器,都是垃圾。
■网友
如图
生成汇编代码(编译器:gcc version 4.9.2 (Debian 4.9.2-10))
【long a=100; long a=100L; long a=(long)100;三种写法有区别吗】
其中的三条movq指令对应着三条定义语句。综上,三种方式经过编译器编译后都是一样的。关于隐式转化和显示转化的问题,很多答主已经说了。以上
■网友
这个100是个literal const,所以没有区别
■网友
\u0026lt;del\u0026gt;1 和 3 在 100 不是 100 而是一个大于 INT_MAX 小于 LONG_MAX 的数的时候会炸
■网友
这类问题不是我的菜,不过受邀简单说一下long a=100; 隐式类型转换,可能会被编译器优化掉。long a=100L; 无类型转换long a=(long)100;显式类型转换,编译时优化不掉,一定要运行时执行。
推荐阅读
- 北京空气达标天数较2013年增加100天
- 西南地区最大再生水厂完成提标改造每日可生产100万吨再生水
- 浙江舟山破获一起烟草类特大非法经营案涉案1000余万元
- 1-11月河北入海口断面水质达标率100%
- 河北承德持续改善水环境质量水质达标率100%
- 河北承德危险废物综合利用处置率达100%
- 电动车第一线|电动车配多大的电池,可以跑100公里以上?师傅告诉你真实答案!
- 大秦赋|等了1000多天,终于等到了
- 海西商界|周杰伦代言12年!这家中国电动小摩托,13年卖出4100万辆
- 100W——150W有啥好的车
