蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程


    

蓝森林 http://www.lslnet.com 2006年6月6日 10:18


【求教】int64溢出问题!!!

a.cpp代码:   [aix操作系统]
#include <stdio.h>
#include <string>
#include <iostream>

using namespace std ;

int main()
{
   printf("int64 [%d]\n", sizeof(int64)) ;
   int64 tt = 10012493449 ;
   printf("tt=[%ld]\n", tt) ;
}

编译:
xlC_r -q32 a.cpp -o a32

报警告:
"a.cpp", line 7.20: 1540-0840 (W) The integer literal "10012493449" is out of range.

执行a32:
[color=Green][b]int64 [8]
tt=[0][/b][/color]

哪位大牛能帮忙分析一下,为什么int64是8字节长度, 而10012493449却溢出了???

你试试lld。

printf("tt=[%lld]\n", tt) ;

执行a32:
int64 [8]
tt=[1422558857]

int64 tt = 10012493449LL ;
要是还不行,我也没办法了。

int64 tt = 10012493449ll ;
printf("tt=[%lld]\n", tt) ;

执行a32:
int64 [8]
tt=[10012493449]


这样可行,能否帮忙解释一下原因。

怎么10012493449不会自动转换为int64吗?

-->
这个,恐怕得问写编译器的人怎么写的吧?:em15:
标准里面应该是会自动转换的。

10012493449 是常数,具有 int 类型吧

如果你编译时报溢出说明int64使用32位编译时这个整形还是4个字节的用 -q64编译选项试试;
如果不行的话,可以使用变通的办法:你的目的是使用8字节整数,使用long long来定义。


这个问题是在64位程序移植到32位时发现的,64位是没有问题。


怪的是打印出sizeof(int64)是8字节,而编译时(赋值操作),int64怎么又变为4字节。

win_hate不是已经告诉你了吗?
10012493449 作为常数,默认就是个int型,在32位机上超出int型的范围了
要表示一个长整数,应该写成10012493449ll

-->
在gcc中是没有问题的,
没看规范,不知道规范是不是规定会自动提升。
我猜想还是IBM编译器的问题。

-->
在AIX、HP-UNIX下不行,在Linux、Solaris下通过
99标准上说,不带后缀可以支持int、long int、long long int
保险一点,还是应该在long long型的常量后带LL

能支持,但会有警告:

[code]
#include <stdio.h>
int main()
{
        0xfffffffff;
}
[/code]

cc 1.c
1.c: In function `main':
1.c:4: warning: integer constant is too large for "long" type

-->

因为不带后缀的话,编译器默认是一个int类型,这么大肯定越界了,所以会发出警告,但是一般只会有警告,不会出错,也一样会通过编译,所以要带个后缀,这样编译器就认识了

-->

好多机器啊 :em15:

-->
公司有十多台小型机~~~
不过马上要跟它们说再见了
:(

-->
我的gcc3.2.2,
没有警告。:roll:

-->
如果是HP上使用long long也需要注意:
HP上大CC编译时如果不加-ext编译选项则 long long 还是会表示4个字节,CC默认是ANSI模式。
如果是小cc编译-Ae来编译,否则会报不支持long long 类型。



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com