Chinaunix

标题: 【求教】int64溢出问题!!! [打印本页]

作者: llj    时间: 2006-04-20 18:26
标题: 【求教】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:
int64 [8]
tt=[0]


哪位大牛能帮忙分析一下,为什么int64是8字节长度, 而10012493449却溢出了???
作者: lenovo    时间: 2006-04-20 18:38
你试试lld。
作者: llj    时间: 2006-04-20 18:44
printf("tt=[%lld]\n", tt) ;

执行a32:
int64 [8]
tt=[1422558857]
作者: lenovo    时间: 2006-04-20 19:02
int64 tt = 10012493449LL ;
要是还不行,我也没办法了。
作者: llj    时间: 2006-04-20 19:10
int64 tt = 10012493449ll ;
printf("tt=[%lld]\n", tt) ;

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


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

怎么10012493449不会自动转换为int64吗?
作者: lenovo    时间: 2006-04-20 19:24
原帖由 llj 于 2006-4-20 19:10 发表
int64 tt = 10012493449ll ;
printf("tt=[%lld]\n", tt) ;

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


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

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

这个,恐怕得问写编译器的人怎么写的吧?
标准里面应该是会自动转换的。
作者: win_hate    时间: 2006-04-20 20:22
10012493449 是常数,具有 int 类型吧
作者: hkwang66    时间: 2006-04-21 00:32
如果你编译时报溢出说明int64使用32位编译时这个整形还是4个字节的用 -q64编译选项试试;
如果不行的话,可以使用变通的办法:你的目的是使用8字节整数,使用long long来定义。

[ 本帖最后由 hkwang66 于 2006-4-21 00:35 编辑 ]
作者: llj    时间: 2006-04-21 12:19
这个问题是在64位程序移植到32位时发现的,64位是没有问题。


怪的是打印出sizeof(int64)是8字节,而编译时(赋值操作),int64怎么又变为4字节。
作者: yuxh    时间: 2006-04-21 12:31
win_hate不是已经告诉你了吗?
10012493449 作为常数,默认就是个int型,在32位机上超出int型的范围了
要表示一个长整数,应该写成10012493449ll
作者: lenovo    时间: 2006-04-21 12:43
原帖由 yuxh 于 2006-4-21 12:31 发表
win_hate不是已经告诉你了吗?
10012493449 作为常数,默认就是个int型,在32位机上超出int型的范围了
要表示一个长整数,应该写成10012493449ll

在gcc中是没有问题的,
没看规范,不知道规范是不是规定会自动提升。
我猜想还是IBM编译器的问题。
作者: yuxh    时间: 2006-04-21 13:44
原帖由 lenovo 于 2006-4-21 12:43 发表

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

在AIX、HP-UNIX下不行,在Linux、Solaris下通过
99标准上说,不带后缀可以支持int、long int、long long int
保险一点,还是应该在long long型的常量后带LL
作者: win_hate    时间: 2006-04-21 14:28
能支持,但会有警告:


  1. #include <stdio.h>
  2. int main()
  3. {
  4.         0xfffffffff;
  5. }
复制代码


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

Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs
Configured with: /gcc/gcc-3.4.4/gcc-3.4.4-1/configure --verbose --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-languages=c,ada,c++,d,f77,java,objc --enable-nls --without-included-gettext --enable-version-specific-runtime-libs --without-x --enable-libgcj --disable-java-awt --with-system-zlib --enable-interpreter --disable-libgcj-debug --enable-threads=posix --enable-java-gc=boehm --disable-win32-registry --enable-sjlj-exceptions --enable-hash-synchronization --enable-libstdcxx-debug : (reconfigured)
Thread model: posix
gcc version 3.4.4 (cygming special) (gdc 0.12, using dmd 0.125)

作者: cjaizss    时间: 2006-04-21 14:32
因为不带后缀的话,编译器默认是一个int类型,这么大肯定越界了,所以会发出警告,但是一般只会有警告,不会出错,也一样会通过编译,所以要带个后缀,这样编译器就认识了
作者: win_hate    时间: 2006-04-21 14:36
原帖由 yuxh 于 2006-4-21 13:44 发表

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


好多机器啊
作者: yuxh    时间: 2006-04-21 14:43
原帖由 win_hate 于 2006-4-21 14:36 发表


好多机器啊

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

作者: lenovo    时间: 2006-04-21 17:46
原帖由 win_hate 于 2006-4-21 14:28 发表
能支持,但会有警告:


  1. #include <stdio.h>
  2. int main()
  3. {
  4.         0xfffffffff;
  5. }
复制代码


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

我的gcc3.2.2,
没有警告。
作者: hkwang66    时间: 2006-04-22 01:51
原帖由 yuxh 于 2006-4-21 13:44 发表

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

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




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2