waixiong 发表于 2022-1-11 21:36:58

有关unsigned 问题

#include <stdio.h>
#include <math.h>
int main()
{
        int i=0;
        unsignedlong longsum=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;
}

1449620085 发表于 2022-1-12 10:09:41

傻眼貓咪 发表于 2022-1-11 21:40


请问那里改是因为什么哇?

傻眼貓咪 发表于 2022-1-12 10:22:50

1449620085 发表于 2022-1-12 10:09
请问那里改是因为什么哇?

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

1449620085 发表于 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被定义了数据类型吗?

傻眼貓咪 发表于 2022-1-12 12:05:57

1449620085 发表于 2022-1-12 10:54
int main()
{
      unsigned long long sum = 0;


也可以这么说{:10_254:}

waixiong 发表于 2022-1-23 15:04:31

傻眼貓咪 发表于 2022-1-12 10:22
因为 pow() 返回类型 double,而我们要的是 unsigned long long

那就是说数据类型不同的进行相加结果会等于0??

waixiong 发表于 2022-1-23 15:13:46

傻眼貓咪 发表于 2022-1-11 21:36


#include <stdio.h>
#include <math.h>
int main()
{
      int i=0;
      long longsum=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呢?

傻眼貓咪 发表于 2022-1-23 15:16:57

waixiong 发表于 2022-1-23 15:04
那就是说数据类型不同的进行相加结果会等于0??

不是的,是因为数据太大了,只能用 unsigned long long 类型

waixiong 发表于 2022-1-23 17:00:02

傻眼貓咪 发表于 2022-1-23 15:16
不是的,是因为数据太大了,只能用 unsigned long long 类型

那为啥结果等于0嘞?

傻眼貓咪 发表于 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 溢出了

waixiong 发表于 2022-1-23 17:45:31

傻眼貓咪 发表于 2022-1-23 17:12
因为数据太大了,溢出吧:输出结果:最后一次 sum 溢出了

谢谢你!

傻眼貓咪 发表于 2022-1-23 18:14:13

waixiong 发表于 2022-1-23 17:45
谢谢你!

不客气{:5_109:}
页: [1]
查看完整版本: 有关unsigned 问题