鱼C论坛

 找回密码
 立即注册
查看: 1960|回复: 12

[已解决]有关unsigned 问题

[复制链接]
发表于 2022-1-11 21:36:58 | 显示全部楼层 |阅读模式
5鱼币
#include <stdio.h>
#include <math.h>
int main()
{
        int i=0;
        unsigned  long long  sum=0;
        unsigned long long result;
        for(i;i<64;i++)
                sum = sum +pow(2,i);
        result = sum/25000;
        printf("%llu",result);
        return 0;
}
这样子的结果为什么是0?跟用temp= pow(2,i)有什么区别?
最佳答案
2022-1-11 21:36:59
#include <stdio.h>
#include <math.h>

int main()
{
    unsigned long long sum = 0;
    unsigned long long result;
    
    for(int i = 0; i < 64; i++)
    sum = sum + (unsigned long long)pow(2, i); // <---------- 注意这里 ----------
    
    result = sum/25000;
    printf("%llu", result);
    
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-11 21:36:59 | 显示全部楼层    本楼为最佳答案   
#include <stdio.h>
#include <math.h>

int main()
{
    unsigned long long sum = 0;
    unsigned long long result;
    
    for(int i = 0; i < 64; i++)
    sum = sum + (unsigned long long)pow(2, i); // <---------- 注意这里 ----------
    
    result = sum/25000;
    printf("%llu", result);
    
    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-12 10:09:41 | 显示全部楼层

请问那里改是因为什么哇?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-12 10:22:50 From FishC Mobile | 显示全部楼层
1449620085 发表于 2022-1-12 10:09
请问那里改是因为什么哇?

因为 pow() 返回类型 double,而我们要的是 unsigned long long

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
1449620085 + 3 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-12 10:54:36 | 显示全部楼层
傻眼貓咪 发表于 2022-1-12 10:22
因为 pow() 返回类型 double,而我们要的是 unsigned long long

int main()
{
        unsigned long long sum = 0;
        unsigned long long temp;
        unsigned long long weight;
        int i;

        for (i=0; i < 64; i++)
        {
                temp = pow(2, i);
                sum = sum + temp;
        }
那这里的pow不加unsigned long long 是因为前面的temp被定义了数据类型吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-12 12:05:57 From FishC Mobile | 显示全部楼层
1449620085 发表于 2022-1-12 10:54
int main()
{
        unsigned long long sum = 0;

也可以这么说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 15:04:31 | 显示全部楼层
傻眼貓咪 发表于 2022-1-12 10:22
因为 pow() 返回类型 double,而我们要的是 unsigned long long

那就是说数据类型不同的进行相加结果会等于0??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 15:13:46 | 显示全部楼层
#include <stdio.h>
#include <math.h>
int main()
{
        int i=0;
        long long  sum=0;
        long long result;
        for(i;i<64;i++)
           sum = sum +(long long)pow(2,i);
        result = sum/25000;
        printf("%lld",result);
        return 0;
}
这样我把unsigned 去掉,为什么结果也是等于0呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-23 15:16:57 | 显示全部楼层
waixiong 发表于 2022-1-23 15:04
那就是说数据类型不同的进行相加结果会等于0??

不是的,是因为数据太大了,只能用 unsigned long long 类型
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 17:00:02 | 显示全部楼层
傻眼貓咪 发表于 2022-1-23 15:16
不是的,是因为数据太大了,只能用 unsigned long long 类型

那为啥结果等于0嘞?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-23 17:12:14 | 显示全部楼层
waixiong 发表于 2022-1-23 17:00
那为啥结果等于0嘞?


因为数据太大了,溢出吧:
#include <stdio.h>
#include <math.h>

int main()
{
    int i = 0;
    long long sum = 0;
    long long result;
    for(i; i < 64; i++){
        sum = sum +(long long)pow(2, i);
        printf("第%d次:%lld\n", i, sum); // 打印每次循环结果
    }
    result = sum/25000;
    printf("%lld", result);
    return 0;
}
输出结果:
第0次:1
第1次:3
第2次:7
第3次:15
第4次:31
第5次:63
第6次:127
第7次:255
第8次:511
第9次:1023
第10次:2047
第11次:4095
第12次:8191
第13次:16383
第14次:32767
第15次:65535
第16次:131071
第17次:262143
第18次:524287
第19次:1048575
第20次:2097151
第21次:4194303
第22次:8388607
第23次:16777215
第24次:33554431
第25次:67108863
第26次:134217727
第27次:268435455
第28次:536870911
第29次:1073741823
第30次:2147483647
第31次:4294967295
第32次:8589934591
第33次:17179869183
第34次:34359738367
第35次:68719476735
第36次:137438953471
第37次:274877906943
第38次:549755813887
第39次:1099511627775
第40次:2199023255551
第41次:4398046511103
第42次:8796093022207
第43次:17592186044415
第44次:35184372088831
第45次:70368744177663
第46次:140737488355327
第47次:281474976710655
第48次:562949953421311
第49次:1125899906842623
第50次:2251799813685247
第51次:4503599627370495
第52次:9007199254740991
第53次:18014398509481983
第54次:36028797018963967
第55次:72057594037927935
第56次:144115188075855871
第57次:288230376151711743
第58次:576460752303423487
第59次:1152921504606846975
第60次:2305843009213693951
第61次:4611686018427387903
第62次:9223372036854775807
第63次:-1
0
最后一次 sum 溢出了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-1-23 17:45:31 | 显示全部楼层
傻眼貓咪 发表于 2022-1-23 17:12
因为数据太大了,溢出吧:输出结果:最后一次 sum 溢出了

谢谢你!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-23 18:14:13 | 显示全部楼层

不客气
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 16:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表