初学C,做题时写了个将年龄转为秒的程序,前126年都可以,但是从127开始就overflow了……虽然很少有人活到127,但我还是希望能为127岁以上的寿星们转换一下单位。。。。求指点~
20 个解决方案
#1
定义一个结构体存储,溢出的部分转存到另一个变量
#2
用字符串去表示
#3
root@~ #echo $((127*365*24*3600))
4005072000
root@~ #
活127年才这么些秒数,这个数long int型足矣呀
4005072000
root@~ #
活127年才这么些秒数,这个数long int型足矣呀
#4
BigInteger for .NET
Ruby
python
Ruby
python
#5
饿,,小弟初学乍练,不太懂struct的用法。
#6
是啊,我就是觉得很奇怪哦,我之前是这样写的:
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
根据我6楼做的修改,测试到136还正常,可到137又溢出了,这是什么情况啊...?
#8
unsigned long long 是64位的,完全够表示127年的秒数
#9
话是这么说没错啦,但unsigned long long 是C99才引入的,devcpp不知道支不支持啊。
#10
devcpp当然支持了,它用的就是MinGW的GCC,你只要编译时加个参数-std=c99,就行了。
#11
靠内置类型来定义的话,unsigned long long 是最大的了,
如果通过数组来构造大数的话,就不是了。。。比如 int a[1024],构造1024位整数..
如果通过数组来构造大数的话,就不是了。。。比如 int a[1024],构造1024位整数..
#12
这个参数怎么加呀,我初学的,不知道额。
#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 实现为单精度类型的编译器,你就悲剧了……
你的问题在于那个乘法。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
#18
回答很详细了。
#19
+1
#20
我在AVR GCC中试过unsigned long long test;
没有报错,占用之8个字节
没有报错,占用之8个字节
#21
#1
定义一个结构体存储,溢出的部分转存到另一个变量
#2
用字符串去表示
#3
root@~ #echo $((127*365*24*3600))
4005072000
root@~ #
活127年才这么些秒数,这个数long int型足矣呀
4005072000
root@~ #
活127年才这么些秒数,这个数long int型足矣呀
#4
BigInteger for .NET
Ruby
python
Ruby
python
#5
饿,,小弟初学乍练,不太懂struct的用法。
#6
是啊,我就是觉得很奇怪哦,我之前是这样写的:
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
根据我6楼做的修改,测试到136还正常,可到137又溢出了,这是什么情况啊...?
#8
unsigned long long 是64位的,完全够表示127年的秒数
#9
话是这么说没错啦,但unsigned long long 是C99才引入的,devcpp不知道支不支持啊。
#10
devcpp当然支持了,它用的就是MinGW的GCC,你只要编译时加个参数-std=c99,就行了。
#11
靠内置类型来定义的话,unsigned long long 是最大的了,
如果通过数组来构造大数的话,就不是了。。。比如 int a[1024],构造1024位整数..
如果通过数组来构造大数的话,就不是了。。。比如 int a[1024],构造1024位整数..
#12
这个参数怎么加呀,我初学的,不知道额。
#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 实现为单精度类型的编译器,你就悲剧了……
你的问题在于那个乘法。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
#18
回答很详细了。
#19
+1
#20
我在AVR GCC中试过unsigned long long test;
没有报错,占用之8个字节
没有报错,占用之8个字节