我有遍历数字并创建该整数的字符数组表示的代码。因此,对于像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,所以不确定它为什么会在那里终止。我认为这是数据类型的一些问题,我做得不对。
以下是print语句:
printk("long=%llu sec=%llu , char=%c\n", num, (num/10)*10, (char)(((int)'0')+((num - (num/10)*10 ))));发布于 2012-12-08 07:20:02
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-08 07:19:27
您的代码很好。问题是num的类型是有符号的(即只有long long)。将其更改为(unsigned long long),您就应该可以运行了。
发布于 2012-12-08 07:11:26
为什么不使用模运算符来计算除法的剩余部分,以获得最后一位数字?
下面的整数
do {
c[i++] = (char)(((int)'0')+(num %10 ));
} while ((num = (num/10)) != 0);https://stackoverflow.com/questions/13772446
复制相似问题