1

我有循环数字并创建该整数的字符数组表示的代码。所以对于像 1234 这样的数字,我得到一个看起来像 {'1', '2', '3', '4'}

部分代码如下所示:

do {
   //print here
     c[i++] = (char)(((int)'0')+(num - (num/10)*10 ));
} while ((num = num/10) != 0);

当涉及大型数据类型(如 long long int)时,我遇到了问题:18446612134627563776

我在循环中打印的值是:

18446612134627563776
18446730879801352832
18446742754318731738
...
18446744073709551615

值应该是

18446612134627563776
1844661213462756377
184466121346275637
...
18
1

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

这是打印语句:

printk("long=%llu sec=%llu , char=%c\n", num, (num/10)*10, (char)(((int)'0')+((num - (num/10)*10 ))));
4

4 回答 4

2

你的代码很好。问题是类型num是有符号的(即只是long long)。将其更改为 ( unsigned long long),您应该一切顺利。

于 2012-12-07T23:19:27.180 回答
1

long long int: 18446612134627563776

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

2^63-1 = 9223372036854775807

您的值大于那个值,并且溢出,可能

2^63 - 18446612134627563776 = -131939081987840

打印的值为

2^64 + (-131939081987840)/(10^k)

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

于 2012-12-07T23:20:01.640 回答
0

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

下面的整数

do {
    c[i++] = (char)(((int)'0')+(num %10 ));
} while ((num = (num/10)) != 0);
于 2012-12-07T23:11:25.713 回答
0

不是溢出,我用这段代码测试过。

unsigned long long num = 18446612134627563776;
char c[100];
unsigned int i = 0;

do {
    //print here
    c[i++] = '0'+ (char)(num - (num/10)*10 );
} while ((num = num/10) != 0);

c[i] = '\0';
cout << c << endl;

问题是编译器可能试图将 10 用作 int,并且在转换时遇到问题。放入铸件后,它确实有效。问题是算法是倒退的,因为它会引入 6,然后是 7,等等... 上面的代码的输出如下,除了强制转换外,它与他的完全相同。

这是实际代码和实际输出。

677365726431221664481

希望这可以帮助 :-)

于 2012-12-07T23:25:36.950 回答