鱼C论坛

 找回密码
 立即注册
查看: 2686|回复: 14

想写一个求2的64次方的代码

[复制链接]
发表于 2021-10-1 19:00:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

                               
登录/注册后可看大图

出现以上内容,请问大神,为什么2的32次方和2的64次方的结果是一样的
写的程序如下:
#include <stdio.h>
#include <math.h>
int main(void)
{
            unsigned int result = pow(2,64) -1;
            printf("result = %u\n",result);
            return 0;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-10-1 19:11:33 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main(void)
  4. {
  5.     unsigned long long result = pow(2,64) -1;
  6.     printf("result = %llu\n",result);
  7.     return 0;
  8. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 19:18:24 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>

  3. int main(void)
  4. {
  5.     double result = pow(2, 64) - 1;
  6.     printf("result = %.f\n", result);

  7.     return 0;
  8. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 20:44:24 | 显示全部楼层
不是有警告么,隐式常量溢出。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-1 21:33:06 | 显示全部楼层

照着这个代码得出18446744073709551616,可是不知道为啥要用double,取职范围讲了不是要用unsigned吗,double不是双精度小数吗。。。。不明白。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-1 21:34:58 | 显示全部楼层

我照 着您说的代码打进去得出的还是4294967295这个,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 21:38:04 | 显示全部楼层
317109954 发表于 2021-10-1 21:34
我照 着您说的代码打进去得出的还是4294967295这个,

看看你的
  1. #include <stdio.h>
  2. #include <stdint.h>

  3. int main(void)
  4. {
  5.     printf("unsigned long long: %lu\n", sizeof(unsigned long long));
  6.     printf("uint64_t: %lu\n", sizeof(uint64_t));
  7.     return 0;
  8. }
复制代码

  1. $ ./main
  2. unsigned long long: 8
  3. uint64_t: 8
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-1 22:10:32 | 显示全部楼层
本帖最后由 hrpzcf 于 2021-10-1 22:41 编辑
317109954 发表于 2021-10-1 21:33
照着这个代码得出18446744073709551616,可是不知道为啥要用double,取职范围讲了不是要用unsigned吗,dou ...


我也不懂,刚学C几天,看见pow返回double类型改的,果然出错了

(2**64)-1 = 18446744073709551615 才对。

可能是因为2的64次方经超过所有类型的精度上限了, pow 返回的值也是不精确的,所以没办法精确算出减 1 后的值, 百度了一下说要用数组解决。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-4 00:47:40 | 显示全部楼层

我接着再试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-4 09:05:20 | 显示全部楼层
常规类型是不够放了的,那么就用字符串来放(字符串和数字是可以互相转的);
下面手打的,你自己改下格式吧,还有那个跳过循环英文单词不会写,填好应该就可以了


  1. int main()
  2. {
  3.         //初始化
  4.         char c_str[32];
  5.         memset(c_str,'0',sizeof(c_str));
  6.         c_str[0]='1';

  7.         int index = 0;
  8.         int aaaa  =0;

  9.         //循环64次
  10.         for(int i=0;i<64;i++)
  11.         {
  12.                 //依次写入c_str;
  13.                 for(int j =0;j<32;j++)
  14.                 {
  15.                         index    = (c_str[j]-'0')<<1;
  16.                         c_str[j] = index +aaaa +'0';
  17.                         aaaa     = index /10;
  18.                 }

  19.         }

  20.         for(int i =31;i>=0;i--)
  21.         {
  22.                 if(c_str[i] != 0)               
  23.                 {
  24.                         conti      ;       //这个是跳过此次循环,单词忘记了
  25.                 }
  26.                 std::cout<<c_str[i]<<std::endl;
  27.         }
  28. }

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-4 09:55:02 | 显示全部楼层
为什么2的32次方和2的64次方的结果是一样的?
答:跟系统大小有关,在32位系统unsigned int的取值范围就那么大,只占4个字节,你非要分配8个字节,系统只能按照4个字节处理,但是你用64位系统去编译结果就不一样
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

匿名鱼油
匿名鱼油  发表于 2021-10-4 17:29:21
本帖最后由 匿名 于 2021-10-4 17:32 编辑

#include<stdio.h>
int main()
{
        int a[100]={1};
        int n;
        scanf("%d",&n);
        int i,j,k;
        for(i=0;i<n;i++)
       {
               for(j=n-1;j>=0;j--)
              {
                    a[j]=a[j]+a[j];
                    if(a[j]>9)
                    {
                            a[j]=a[j]-10;
                            a[j+1]++;
                    }
              }
        }
        for(k=99;k>=0&&a[k]==0;k--);
        for(;k>=0;k--)
        {
                        printf("%d",a[k]);
        }       
        return 0;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-4 21:54:52 | 显示全部楼层
2736946915 发表于 2021-10-4 09:05
常规类型是不够放了的,那么就用字符串来放(字符串和数字是可以互相转的);
下面手打的,你自己改下格式吧 ...

哇,,谢谢,刚学到字符,是在做数据类型的课后作业遇到的问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-4 21:56:11 | 显示全部楼层

for,,,scanf这些,我还没有学,if都还没有学,是在数据类型这一节课后作业的题,,谢谢啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-4 21:57:21 | 显示全部楼层
易道云 发表于 2021-10-4 09:55
为什么2的32次方和2的64次方的结果是一样的?
答:跟系统大小有关,在32位系统unsigned int的取值范围就那 ...

不会吧,,,,好吧,,,我再看看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-28 16:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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