【发布时间】:2016-05-22 15:12:57
【问题描述】:
我试图理解为什么这个程序在 2^20-1 值之后会溢出。我所有的变量都声明为 unsigned long long,但是当我输入 1048756 2^20 时,它进入了溢出,而不是将其转换为二进制数。我以为u-l-l的范围是2^64-1。 我包含了limits.h库,最大值是8个字节。这是代码:
#include <stdio.h>
int main(){
unsigned long long n = 100000000;
printf("%llu \n",decimal_binary(n));
return 0;
}
unsigned long long decimal_binary(unsigned long long n)
{
unsigned long long rem, i=1, binary=0;
while (n!=0)
{
rem=n%2;
n/=2;
binary+=rem*i;
i*=10;
}
return binary;
}
输出是:
14184298036271661312(显然不是二进制数)
【问题讨论】:
-
@callyalater - 无论系统如何,
unsigned long long至少具有问题中指示的范围,即从 0 到 2^64 - 1。 -
请缩进您的代码。
-
unsigned long long decimal_binary(unsigned long long n)未在使用前声明。确保在您的编译器中启用警告。 -
使用 OP 的方法,代码需要大约 89 位整数才能正确显示
decimal_binary(100000000)的结果。 -
1048756₁₀ 是 100000000000000000000₂ (2²⁰)。您的
decimal_binary函数正在尝试将其转换为 100000000000000000000₁₀ (10²⁰)。这需要一个至少 67 位宽的无符号整数。适合 64 位无符号整数的最大值约为 1.8447x10¹⁹。你看到问题了吗?