printf(%d) 打印一个非常大的整数

问题描述 投票:0回答:1

我做了这个简单的函数来打印 int 数组的内容。 `void print_array(int size, int array[size])

void print_array(int size, int array[size])
{
    printf("{");
    for (int i = 0; i < size - 1; i++)
    {
        printf("%d, ", array[i]);
    }
    printf("%d}\n", array[size - 1]);
}

通过示例似乎效果很好。然而,当我用它来调试函数时,我得到了结果:

{-1, 0, 1, 2, 3, 4, 16, 17, 18, 8, 0, 1, 11, 12, 13, 14, 15, 27, 28, 9, 30, 31, 21, 24, 14, 24, 25, 26, 27, 19, 31, 41, 33, 23, 33, 34, 35, 27, 28, 29, 50, 808779818, -363075840, -202888522, 45, 46, 0, 0, -1377617600, 32767, -1377617208, 32767, 2055390135, 22066, 2055404888, 22066, 448540736, 32670, 446392223, 32670, 16, 48, -1377617632, 32767, -1377617824, 32767, -363075840, -202888522, 448540736, 32670, 32670, 0, 284, 0, 1, 0, 0, 0, -1377617929, 32767}

正如您所看到的,即使我在 printf 函数中使用了 %d 标识符,这里的一些数字太大而无法作为 int 打印。 有人可以向我解释一下这里发生了什么吗? 当我用好的答案测试这个数组的相等性时,测试恰好是正确的(???)。

我尝试通过实践来理解它

    int a = 808779818;
    int b = 42;
    assert(a == b);

但是断言失败了。

c integer printf
1个回答
0
投票

如您所见,这里的一些数字太大,无法打印为 整数

您可以轻松查看系统中的最大和最小整数值是多少:

int main(void)
{
    printf("int: %d  %d\n", INT_MIN, INT_MAX);
    printf("short int: %hd  %hd\n", SHRT_MIN, SHRT_MAX);
    printf("char: %hhd  %hhd\n", CHAR_MIN, CHAR_MAX);
    printf("long int: %ld  %ld\n", LONG_MIN, LONG_MAX);
    printf("long long int: %lld  %lld\n", LLONG_MIN, LLONG_MAX);
}

https://godbolt.org/z/az7nd8fEP

int a = 808779818;
int b = 42;
assert(a == b);

来自手册页:

   If expression is false (i.e., compares equal to zero), assert()
   prints an error message to standard error and terminates the
   program by calling abort(3).  The error message includes the name
   of the file and function containing the assert() call, the source
   code line number of the call, and the text of the argument;
   something like:

但是断言失败了。

预期结果为

808779818 != 42

© www.soinside.com 2019 - 2024. All rights reserved.