如何在没有printf的情况下打印ULONG_MAX
我正在重新编写printf函数。问题是有限制,例如我无法打印ULONG_MAX数字。如何在没有printf的情况下打印ULONG_MAX
printf("%lu", ULONG_MAX) gives me ->18446744073709551615
ft_putnbr(ULONG_MAX) gives me -> -1
我包括以下两个库:
<limits.h>
<locale.h>
,放在我的主要():
setlocale(LC_ALL, "");
我putnbr是这样一个基本的递归功能(与其他效果很好号码):
void ft_putnbr(int nb)
{
if (nb < 0)
{
ft_putchar('-');
nb = -nb;
}
if (nb >= 10)
{
ft_putnbr(nb/10);
ft_putnbr(nb % 10);
}
else
{
ft_putchar(nb + '0');
}
}
任何帮助将不胜感激。
由于看起来您的代码中隐藏了太长时间无法显示的错误,因此我建议您回到旧的调试。
提示:类型为int的参数将无法保存每个无符号长整型值。
我编辑了主题,我只尝试用我的put_nbr显示这个数字这就是所有 – ziKmouT
那么你要做的第一件事就是检查nb
是否小于0
。
这是在ULONG_MAX
情况属实(nb
为int
,而不是unsigned int
传递),所以你把第一个分支。
"-"
被打印,然后-1
转向1
。
在最后一次迭代中,只打印字符1
。
谢谢它的作品!为了获得最大值,我必须传递一个unsigned long long int! – ziKmouT
错误在于您的ft_putnbr()
函数需要参数int
。当你传递一个类型为unsigned long
的变量时,有两个问题。两者都可以在这个片段被复制:
#include <limits.h>
#include <stdio.h>
int main() {
unsigned long my_long = ULONG_MAX;
int my_int = (int) my_long;
printf("%lu\n", my_long);
printf("%i\n", my_int);
}
的第一个问题是,参数是一种比你试图传递给函数的值长度较短的。假设long
在我们的系统上是2个字节,而int
是1个字节(更现实的情况是它们是4或8个字节)。在二进制中,ULONG_MAX
将是1111 1111 1111 1111
。但是,当将其分配给int
(仅为1个字节)时,值将为1111 1111
,因为只有8位的空间。为了通过ULONG_MAX
,我们需要一个相同(或更大)长度的类型,因此所有位都有空间。例如,我们可以使用long
,以便函数签名变为ft_putnbr(long nb);
。
但是,仍然存在一个问题。类型long
是带符号的(即,其中一个位专用于跟踪数字是否为正数),而ULONG_MAX
是无符号类型(即只有正数)。特别是,如果第一位是1,那么表示该数字是负数。所以一个带有二进制值1111 1111 1111 1111
的带符号的2字节类型将是负数。它变成(十进制)-1
的原因超出了这个答案(但你可以在这里阅读:http://en.wikipedia.org/wiki/Two%27s_complement)。
那么,我们该如何解决这两个问题呢?一种方法是让ft_putnbr()
采用非常宽的带符号类型(例如,long long
),并且永不传递任何长度相等或更大的无符号类型。另一种方法是编写两个ft_putnbr()
(具有不同的名称):一个采用最宽的带符号类型,另一个采用最宽的无符号类型。
好,感谢你们我做了两个限制工作(LONG_MAX & LONG_MIN):
void ft_putnbr(long long int nb)
{
if (nb == LONG_MIN)
ft_putstr("-9223372036854775808");
if (nb < 0 && nb != LONG_MIN)
{
ft_putchar('-');
nb = -nb;
}
if (nb >= 10 && nb != LONG_MIN)
{
ft_putnbr(nb/10);
ft_putnbr(nb % 10);
}
else if (nb != LONG_MIN)
{
ft_putchar(nb + '0');
}
}
显示ft_myprintf的'()的定义'以及 – CinCout
将它添加到你的问题。并添加ft_nb_arg,ft_print_it和其他任何你正在调用的函数。你认为人们可以阅读你的想法吗? – gnasher729
这是我的代码可用:https://bitbucket.org/zikmout/ft_printf – ziKmouT