【问题标题】:How do I print the size of int in C?如何在 C 中打印 int 的大小?
【发布时间】:2011-08-22 01:53:12
【问题描述】:

我正在尝试在 RHEL 5.6 64 位上编译以下内容,但我不断收到警告

"var.c:7: 警告:格式 '%d' 期望 输入“int”,但参数 2 具有类型 ‘long unsigned int’”

这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    unsigned int n =10;
    printf("The size of integer is %d\n", sizeof(n));
}

我是否将“n”的声明更改为跟随并不重要

  1. 有符号整数 n =10;
  2. int n = 10;

我要做的就是在我的机器上打印整数的大小,而不需要真正查看limits.h。

【问题讨论】:

标签: c


【解决方案1】:

sizeof 函数返回一个size_t 类型。尝试使用%zu 作为转换说明符,而不是%d

printf("The size of integer is %zu\n", sizeof(n));

澄清一下,如果您的编译器支持 C99,请使用 %zu;否则,或者如果您想要最大的可移植性,打印size_t 值的最佳方法是转换它 到unsigned long 并使用%lu

printf("The size of integer is %lu\n", (unsigned long)sizeof(n));

原因是size_t 被标准保证为无符号类型;然而,该标准并没有规定它必须是任何特定的大小,(只要大到足以代表任何对象的大小)。事实上,如果 unsigned long 不能代表您环境的最大对象,您甚至可能需要使用 unsigned long long 类型转换和 %llu 说明符。

在 C99 中添加了 z 长度修饰符以提供一种方法来指定要打印的值是 size_t 类型的大小。通过使用%zu,您表示正在打印的值是size_t 大小的无符号值。

这是您似乎不必考虑的事情之一,但您确实这样做了。

延伸阅读:

【讨论】:

  • 谢谢吉姆,我注意到了这一点,并且正在编辑以添加进一步的澄清/解释。
  • 罗伯特,谢谢你的解释。您是否也知道 size_t 是在哪里声明的?我查看了 sys/types.h、stdio.h、stdlib.h ,但无法在我的系统上找到 gcc 4.1 的 size_t 定义。另外,我没有 stddef.h
  • size_t 应该在 C 的 stddef.h 中定义。(C++ 的 cstddef)
  • 您可以将结果转换为int,因为sizeof(int) 肯定适合int
  • @Jimm 是的,你确实有 stddef.h——每个 ANSI C 系统都提供它。
【解决方案2】:

您的问题是 size_t 是无符号类型。尝试使用

printf("The size of integer is %u\n", sizeof(n));

你应该摆脱那个警告。

【讨论】:

  • 谢谢,您的解释有帮助。
  • 请注意,这不能移植到size_tunsigned int 具有不同长度的系统。
  • @Jim Balter: 是的,类似于 printf("The size of integer is %zu\n", sizeof(n));在 GCC 或 printf("整数的大小为 %Iu\n", sizeof(n));在 MSVC 上更便携,但是我不知道为一般情况编写此代码的简单方法。
  • 因为sizeof(int) 必须是一个小整数,所以在这种情况下%u 和转换为(unsigned) 就可以了。
【解决方案3】:

我认为你应该改为这样写:

printf("The size of integer is %d\n", sizeof(int));

【讨论】:

  • 这仍然返回警告 var.c:7:警告:格式“%d”需要类型“int”,但参数 2 的类型为“long unsigned int”
  • @SIFE 我很好奇你为什么认为这会产生不同的结果。
  • @Jim 如果我没有忘记,这是在 C 中查看类型大小的正确方法。
  • @SIFE sizeof(int)sizeof(n)(其中 n 被声明为 int)具有相同的值。您似乎没有掌握这里的问题 - 请查看其他答案和 cmets 以便这样做。
  • @Jim 我没说他错,我只是说应该怎么写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2018-08-27
  • 1970-01-01
  • 2023-03-12
相关资源
最近更新 更多