首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >long long计算问题

long long计算问题
EN

Stack Overflow用户
提问于 2012-12-08 07:06:35
回答 4查看 1K关注 0票数 1

我有遍历数字并创建该整数的字符数组表示的代码。因此,对于像1234这样的数字,我得到一个类似{'1','2','3','4'}的数组

部分代码如下所示:

代码语言:javascript
复制
do {
   //print here
     c[i++] = (char)(((int)'0')+(num - (num/10)*10 ));
} while ((num = num/10) != 0);

当涉及到像long long int: 18446612134627563776这样的大型数据类型时,我遇到了一个问题

我输出的循环中的值是:

代码语言:javascript
复制
18446612134627563776
18446730879801352832
18446742754318731738
...
18446744073709551615

这些值应该是

代码语言:javascript
复制
18446612134627563776
1844661213462756377
184466121346275637
...
18
1

奇怪的是,循环终止了。最后打印的值是18446744073709551615 != 0,所以不确定它为什么会在那里终止。我认为这是数据类型的一些问题,我做得不对。

以下是print语句:

代码语言:javascript
复制
printk("long=%llu sec=%llu , char=%c\n", num, (num/10)*10, (char)(((int)'0')+((num - (num/10)*10 ))));
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-08 07:20:02

long long int:18446612134627563776

long long int是有符号类型,通常为64位宽,具有最大可表示数

代码语言:javascript
复制
2^63-1 = 9223372036854775807

您的值大于该值,并且溢出,可能会

代码语言:javascript
复制
2^63 - 18446612134627563776 = -131939081987840

打印值为

代码语言:javascript
复制
2^64 + (-131939081987840)/(10^k)

将类型更改为unsigned long long以获得预期的结果。

票数 1
EN

Stack Overflow用户

发布于 2012-12-08 07:19:27

您的代码很好。问题是num的类型是有符号的(即只有long long)。将其更改为(unsigned long long),您就应该可以运行了。

票数 2
EN

Stack Overflow用户

发布于 2012-12-08 07:11:26

为什么不使用模运算符来计算除法的剩余部分,以获得最后一位数字?

下面的整数

代码语言:javascript
复制
do {
    c[i++] = (char)(((int)'0')+(num %10 ));
} while ((num = (num/10)) != 0);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13772446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档