想写一个求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;
} #include <stdio.h>
#include <math.h>
int main(void)
{
unsigned long long result = pow(2,64) -1;
printf("result = %llu\n",result);
return 0;
}
#include <stdio.h>
#include <math.h>
int main(void)
{
double result = pow(2, 64) - 1;
printf("result = %.f\n", result);
return 0;
}
不是有警告么,隐式常量溢出。 hrpzcf 发表于 2021-10-1 19:18
照着这个代码得出18446744073709551616,可是不知道为啥要用double,取职范围讲了不是要用unsigned吗,double不是双精度小数吗。。。。不明白。 人造人 发表于 2021-10-1 19:11
我照 着您说的代码打进去得出的还是4294967295这个, 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:41 编辑
317109954 发表于 2021-10-1 21:33
照着这个代码得出18446744073709551616,可是不知道为啥要用double,取职范围讲了不是要用unsigned吗,dou ...
我也不懂,刚学C几天,看见pow返回double类型改的,果然出错了{:10_277:}
(2**64)-1 = 18446744073709551615 才对。
可能是因为2的64次方经超过所有类型的精度上限了, pow 返回的值也是不精确的,所以没办法精确算出减 1 后的值, 百度了一下说要用数组解决。 人造人 发表于 2021-10-1 21:38
看看你的
我接着再试 常规类型是不够放了的,那么就用字符串来放(字符串和数字是可以互相转的);
下面手打的,你自己改下格式吧,还有那个跳过循环英文单词不会写,填好应该就可以了
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;
}
}
为什么2的32次方和2的64次方的结果是一样的?
答:跟系统大小有关,在32位系统unsigned int的取值范围就那么大,只占4个字节,你非要分配8个字节,系统只能按照4个字节处理,但是你用64位系统去编译结果就不一样 本帖最后由 匿名 于 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;
} 2736946915 发表于 2021-10-4 09:05
常规类型是不够放了的,那么就用字符串来放(字符串和数字是可以互相转的);
下面手打的,你自己改下格式吧 ...
哇,,谢谢,刚学到字符,是在做数据类型的课后作业遇到的问题 匿名者 发表于 2021-10-4 17:29
#include
int main()
{
for,,,scanf这些,我还没有学,if都还没有学,是在数据类型这一节课后作业的题,,谢谢啊 易道云 发表于 2021-10-4 09:55
为什么2的32次方和2的64次方的结果是一样的?
答:跟系统大小有关,在32位系统unsigned int的取值范围就那 ...
不会吧,,,,好吧,,,我再看看
页:
[1]