|
蓝森林 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 类型。 |
| |