317109954 发表于 2021-10-1 19:00:22

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

http://m.qpic.cn/psc?/166cf503-c32b-42e9-8c6c-689aba6419f8/TmEUgtj9EK6.7V8ajmQrEFYAFOJUE3dVUcJNJnbn.my.FIhe01UdeLAro7sgG0oZjQXpJHpPXFPdJ2SoDeEGtiPkz1MoBatrE80w4s8ZHEM!/b&bo=lgLLAAAAAAADF20!&rf=viewer_4
出现以上内容,请问大神,为什么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;
}

人造人 发表于 2021-10-1 19:11:33

#include <stdio.h>
#include <math.h>

int main(void)
{
    unsigned long long result = pow(2,64) -1;
    printf("result = %llu\n",result);
    return 0;
}

hrpzcf 发表于 2021-10-1 19:18:24

#include <stdio.h>
#include <math.h>

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

    return 0;
}

桃花飞舞 发表于 2021-10-1 20:44:24

不是有警告么,隐式常量溢出。

317109954 发表于 2021-10-1 21:33:06

hrpzcf 发表于 2021-10-1 19:18


照着这个代码得出18446744073709551616,可是不知道为啥要用double,取职范围讲了不是要用unsigned吗,double不是双精度小数吗。。。。不明白。

317109954 发表于 2021-10-1 21:34:58

人造人 发表于 2021-10-1 19:11


我照 着您说的代码打进去得出的还是4294967295这个,

人造人 发表于 2021-10-1 21:38:04

317109954 发表于 2021-10-1 21:34
我照 着您说的代码打进去得出的还是4294967295这个,

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

int main(void)
{
    printf("unsigned long long: %lu\n", sizeof(unsigned long long));
    printf("uint64_t: %lu\n", sizeof(uint64_t));
    return 0;
}


$ ./main
unsigned long long: 8
uint64_t: 8

hrpzcf 发表于 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类型改的,果然出错了{:10_277:}

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

可能是因为2的64次方经超过所有类型的精度上限了, pow 返回的值也是不精确的,所以没办法精确算出减 1 后的值, 百度了一下说要用数组解决。

317109954 发表于 2021-10-4 00:47:40

人造人 发表于 2021-10-1 21:38
看看你的

我接着再试

2736946915 发表于 2021-10-4 09:05:20

常规类型是不够放了的,那么就用字符串来放(字符串和数字是可以互相转的);
下面手打的,你自己改下格式吧,还有那个跳过循环英文单词不会写,填好应该就可以了


int main()
{
        //初始化
        char c_str;
        memset(c_str,'0',sizeof(c_str));
        c_str='1';

        int index = 0;
        int aaaa=0;

        //循环64次
        for(int i=0;i<64;i++)
        {
                //依次写入c_str;
                for(int j =0;j<32;j++)
                {
                        index    = (c_str-'0')<<1;
                        c_str = index +aaaa +'0';
                        aaaa   = index /10;
                }

        }

        for(int i =31;i>=0;i--)
        {
                if(c_str != 0)               
                {
                        conti      ;       //这个是跳过此次循环,单词忘记了
                }
                std::cout<<c_str<<std::endl;
        }
}

易道云 发表于 2021-10-4 09:55:02

为什么2的32次方和2的64次方的结果是一样的?
答:跟系统大小有关,在32位系统unsigned int的取值范围就那么大,只占4个字节,你非要分配8个字节,系统只能按照4个字节处理,但是你用64位系统去编译结果就不一样

Anonymous 发表于 2021-10-4 17:29:21

本帖最后由 匿名 于 2021-10-4 17:32 编辑

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

317109954 发表于 2021-10-4 21:54:52

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

哇,,谢谢,刚学到字符,是在做数据类型的课后作业遇到的问题

317109954 发表于 2021-10-4 21:56:11

匿名者 发表于 2021-10-4 17:29
#include
int main()
{


for,,,scanf这些,我还没有学,if都还没有学,是在数据类型这一节课后作业的题,,谢谢啊

317109954 发表于 2021-10-4 21:57:21

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

不会吧,,,,好吧,,,我再看看
页: [1]
查看完整版本: 想写一个求2的64次方的代码