请问有比【unsigned long long】 更大的整型吗?

时间:2022-10-15 16:44:04
如题。
初学C,做题时写了个将年龄转为秒的程序,前126年都可以,但是从127开始就overflow了……虽然很少有人活到127,但我还是希望能为127岁以上的寿星们转换一下单位。。。。求指点~

20 个解决方案

#1


定义一个结构体存储,溢出的部分转存到另一个变量

#2


用字符串去表示

#3


root@~ #echo $((127*365*24*3600))
4005072000 
root@~ #
活127年才这么些秒数,这个数long int型足矣呀

#4


BigInteger for .NET

Ruby

python

#5


引用 1 楼 momomamo 的回复:
定义一个结构体存储,溢出的部分转存到另一个变量


饿,,小弟初学乍练,不太懂struct的用法。

#6


引用 3 楼 masmaster 的回复:
root@~ #echo $((127*365*24*3600))
4005072000 
root@~ #
活127年才这么些秒数,这个数long int型足矣呀


是啊,我就是觉得很奇怪哦,我之前是这样写的:
unsigned short  year = 0;
  unsigned int second = 3.156e7; /*一年有这么多秒*/
  unsigned long long y_s = 0;
    
  printf("Please enter your age:");
  if(1 == scanf("%d", &year)) {
       if(year <150) {
               y_s = year * second;
               printf ("Your age is equal to %llu seconds!\n", y_s);
       }
……

刚刚把y_s 的类型改成了 unsigned long   把 printf里的 %llu 改成了 %lu ,结果不溢出了,
是不是因为我的编译器(devcpp)不支持C99的缘故呀? :)

#7


引用 3 楼 masmaster 的回复:
root@~ #echo $((127*365*24*3600))
4005072000 
root@~ #
活127年才这么些秒数,这个数long int型足矣呀


根据我6楼做的修改,测试到136还正常,可到137又溢出了,这是什么情况啊...?

#8


unsigned long long 是64位的,完全够表示127年的秒数

#9


引用 8 楼 peacon 的回复:
unsigned long long 是64位的,完全够表示127年的秒数


话是这么说没错啦,但unsigned long long 是C99才引入的,devcpp不知道支不支持啊。

#10


devcpp当然支持了,它用的就是MinGW的GCC,你只要编译时加个参数-std=c99,就行了。

#11


靠内置类型来定义的话,unsigned long long 是最大的了,
如果通过数组来构造大数的话,就不是了。。。比如 int a[1024],构造1024位整数..

#12


引用 10 楼 bokutake 的回复:
devcpp当然支持了,它用的就是MinGW的GCC,你只要编译时加个参数-std=c99,就行了。


这个参数怎么加呀,我初学的,不知道额。

#13


不用开任何编译选项,gcc 默认以编译器扩展的形式支持 unsigned long long 和 long long 类型。

你的问题在于那个乘法。year * second,year 的类型是 unsigned short,second 是 unsigned int。unsigned short * unsigned int 的结果是 unsigned int,已然溢出了,之后再怎么折腾都是徒劳了。

要至少先将一个操作数转换成 unsigned long long,比如 (unsigned long long)year * second。

还有,“unsigned int second = 3.156e7;” 尽量不要这么写。这样是用一个 double 初始化一个 unsigned int,虽然通常结果还是对的(双精度 double 有 53 位二进制有效数字,对付 32 位的 unsigned int 还是足够的),但是如果你不幸地碰到了一个将 double 实现为单精度类型的编译器,你就悲剧了……

#14


用高精度做吧。

#15


long long肯定能放得下的。。有可能是你的编译器不支持long long
可以用数组定义一个大数来储存。。。。

#16


用 int array[]吧,自己随便定义,网上有大量的例题

#17


请问有比【unsigned long long】 更大的整型吗?

#18


引用 13 楼 hpsmouse 的回复:
不用开任何编译选项,gcc 默认以编译器扩展的形式支持 unsigned long long 和 long long 类型。

你的问题在于那个乘法。year * second,year 的类型是 unsigned short,second 是 unsigned int。unsigned short * unsigned int 的结果是 unsigned int,已然溢出了,之后再怎么折腾……

回答很详细了。

#19


引用 13 楼 hpsmouse 的回复:
不用开任何编译选项,gcc 默认以编译器扩展的形式支持 unsigned long long 和 long long 类型。

你的问题在于那个乘法。year * second,year 的类型是 unsigned short,second 是 unsigned int。unsigned short * unsigned int 的结果是 unsigned int,已然溢出了,之后再怎么折腾……
+1

#20


我在AVR GCC中试过unsigned long long test;
没有报错,占用之8个字节

#1


定义一个结构体存储,溢出的部分转存到另一个变量

#2


用字符串去表示

#3


root@~ #echo $((127*365*24*3600))
4005072000 
root@~ #
活127年才这么些秒数,这个数long int型足矣呀

#4


BigInteger for .NET

Ruby

python

#5


引用 1 楼 momomamo 的回复:
定义一个结构体存储,溢出的部分转存到另一个变量


饿,,小弟初学乍练,不太懂struct的用法。

#6


引用 3 楼 masmaster 的回复:
root@~ #echo $((127*365*24*3600))
4005072000 
root@~ #
活127年才这么些秒数,这个数long int型足矣呀


是啊,我就是觉得很奇怪哦,我之前是这样写的:
unsigned short  year = 0;
  unsigned int second = 3.156e7; /*一年有这么多秒*/
  unsigned long long y_s = 0;
    
  printf("Please enter your age:");
  if(1 == scanf("%d", &year)) {
       if(year <150) {
               y_s = year * second;
               printf ("Your age is equal to %llu seconds!\n", y_s);
       }
……

刚刚把y_s 的类型改成了 unsigned long   把 printf里的 %llu 改成了 %lu ,结果不溢出了,
是不是因为我的编译器(devcpp)不支持C99的缘故呀? :)

#7


引用 3 楼 masmaster 的回复:
root@~ #echo $((127*365*24*3600))
4005072000 
root@~ #
活127年才这么些秒数,这个数long int型足矣呀


根据我6楼做的修改,测试到136还正常,可到137又溢出了,这是什么情况啊...?

#8


unsigned long long 是64位的,完全够表示127年的秒数

#9


引用 8 楼 peacon 的回复:
unsigned long long 是64位的,完全够表示127年的秒数


话是这么说没错啦,但unsigned long long 是C99才引入的,devcpp不知道支不支持啊。

#10


devcpp当然支持了,它用的就是MinGW的GCC,你只要编译时加个参数-std=c99,就行了。

#11


靠内置类型来定义的话,unsigned long long 是最大的了,
如果通过数组来构造大数的话,就不是了。。。比如 int a[1024],构造1024位整数..

#12


引用 10 楼 bokutake 的回复:
devcpp当然支持了,它用的就是MinGW的GCC,你只要编译时加个参数-std=c99,就行了。


这个参数怎么加呀,我初学的,不知道额。

#13


不用开任何编译选项,gcc 默认以编译器扩展的形式支持 unsigned long long 和 long long 类型。

你的问题在于那个乘法。year * second,year 的类型是 unsigned short,second 是 unsigned int。unsigned short * unsigned int 的结果是 unsigned int,已然溢出了,之后再怎么折腾都是徒劳了。

要至少先将一个操作数转换成 unsigned long long,比如 (unsigned long long)year * second。

还有,“unsigned int second = 3.156e7;” 尽量不要这么写。这样是用一个 double 初始化一个 unsigned int,虽然通常结果还是对的(双精度 double 有 53 位二进制有效数字,对付 32 位的 unsigned int 还是足够的),但是如果你不幸地碰到了一个将 double 实现为单精度类型的编译器,你就悲剧了……

#14


用高精度做吧。

#15


long long肯定能放得下的。。有可能是你的编译器不支持long long
可以用数组定义一个大数来储存。。。。

#16


用 int array[]吧,自己随便定义,网上有大量的例题

#17


请问有比【unsigned long long】 更大的整型吗?

#18


引用 13 楼 hpsmouse 的回复:
不用开任何编译选项,gcc 默认以编译器扩展的形式支持 unsigned long long 和 long long 类型。

你的问题在于那个乘法。year * second,year 的类型是 unsigned short,second 是 unsigned int。unsigned short * unsigned int 的结果是 unsigned int,已然溢出了,之后再怎么折腾……

回答很详细了。

#19


引用 13 楼 hpsmouse 的回复:
不用开任何编译选项,gcc 默认以编译器扩展的形式支持 unsigned long long 和 long long 类型。

你的问题在于那个乘法。year * second,year 的类型是 unsigned short,second 是 unsigned int。unsigned short * unsigned int 的结果是 unsigned int,已然溢出了,之后再怎么折腾……
+1

#20


我在AVR GCC中试过unsigned long long test;
没有报错,占用之8个字节

#21