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整型常量的类型是在下表中能表示它的值的第一个类型。long a=100; long a=100L; long a=(long)100;三种写法有区别吗

C++11 2.14.2 Integer literals整型常量的类型是在表6中能表示它的值的第一个类型。long a=100; long a=100L; long a=(long)100;三种写法有区别吗

(两张表一样的)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是个变量而非立即数的情况下才会有区别。
■网友
没有区别。第一种情况有隐式转换,第三种是显式转换。恕我直言,不能将这种转换优化掉的编译器,都是垃圾。
■网友
如图long a=100; long a=100L; long a=(long)100;三种写法有区别吗

生成汇编代码(编译器:gcc version 4.9.2 (Debian 4.9.2-10))long a=100; long a=100L; long a=(long)100;三种写法有区别吗
【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;显式类型转换,编译时优化不掉,一定要运行时执行。


    推荐阅读