Chinaunix首页 | 论坛 | 博客
  • 博客访问: 577935
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2356
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

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

阅读(1654) | 评论(5) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-15 10:54:47

周星星
printf( "%I64d", a );

网友评论2012-11-15 10:54:33

GhostEx
请问:__int64 型的数据如何用sprintf()之类的函数输出啊??

现在直接调用sprintf()之后,输出的是低32位的数据,郁闷~~~

网友评论2012-11-15 10:54:05

oldjacky
很多人喜欢写 float f = 1.0; 这是不严格的,严格的应该写成 float f = 1.0f;

为什么会是不严格的呢?

补充星星的一点:

例:float f = 1.0;//右值默认是double,到左值需要一个转换,double->float 的转换,精度上可能会受损,所以最好加上后缀(float f = 1.0f;)

网友评论2012-11-15 10:53:44

周星星
从这个测试上来看,是可以的呀。

网友评论2012-11-15 10:53:30

阿荣
超长的可以自动由long变为__int64么?