2012年(158)
分类: C/C++
2012-11-15 10:52:16
很多人喜欢写 float f = 1.0; 这是不严格的,严格的应该写成 float f =
1.0f;
为此总结了一些修饰规则供大家参考: ( 以下修饰字符不区分大小写 )
a. 不加任何修饰的整数值类型是 int
b.
不加任何修饰的浮点数值类型是 double, 而不是 float
c. 如果数值过大int/double不能容纳, 则最小限度的扩张(
VC5.0及之后的版本取消了80bit的浮点类型所以double无法扩张 )(见文章最后的红字补充)
d. u 表示 unsigned
e. l
表示 long ( 不要忘了long可以修饰整型也可以修饰浮点型,比如 long double )
#include
using
namespace std;
int
main()
{
cout << typeid(
0 ).name() << endl; // int
cout
<< typeid( 0u ).name() <<
endl; // unsigned int
cout << typeid( 0l ).name() << endl; //
long
cout << typeid(
0ul ).name() << endl; // unsigned
long
cout << typeid(
0.0 ).name() << endl; // double
cout
<< typeid( 0.0f ).name() <<
endl; // float
cout << typeid( 0.0l ).name() << endl; //
long double
cout <<
"--------------------------------------\n";
cout << typeid( 0xFFFFFFFF ).name() << endl; // unsigned int 可以容纳得下
cout << typeid( 0xFFFFFFFFFF ).name() << endl; // 只有 __int64 可以容纳得下
cout << typeid( 0xFFFFFFFFFFFFFFFF ).name() << endl; // 只有 unsigned __int64
可以容纳得下
system("PAUSE");
return 0;
}
2004-07-14补充:对于C规则,《C++ program
language》上说对于不同进制的立即数在自动扩张时的规则有所区别。
对于10进制常量,int
-> long -> long long
对于16进制常量,int -> unsigned int -> long ->
unsigned long -> long long -> unsigned long long
对于C++,使用VC++9.0和g++4.5.2测试结果一致:
0x0FFFFFFF //
int
0xFFFFFFFF // unsigned int
0xFFFFFFFFF // long long
268435455 //
int
4294967295 // unsigned long
68719476735 // long
long
在C++中,long long
还不是一个标准的关键字(C中long long已经是标准类型了,C++中即将也是)
VC++中使用 I64 来修饰 __int64, 使用 uI64
来修饰 unsigned __int64(古老的VC6是这样,新的VC8已经支持标准的ll和ull了)
GCC 中使用 ll 来修饰 long long,
使用 ull 来修饰 unsigned long long
VC++中的 __int64 等同于 GCC中的 long
long