如何在C语言中打印int类型的大小?

21

我正在尝试在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. signed int n =10;
  2. int n = 10;

我只想打印出我的机器上整数的大小,而不必深入研究limits.h。


2
可能是 Platform independent size_t Format specifiers in c? 的重复问题。 - maxschlepzig
可能是跨平台格式化字符串变量size_t的重复问题? - Ciro Santilli OurBigBook.com
可能是如何正确使用printf打印size_t?的重复问题。 - phuclv
3个回答

50

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大小的无符号值。
这是其中一些似乎不应该考虑的事情,但您确实需要考虑。
进一步阅读:

谢谢Jim,我注意到了,并且正在编辑中添加更多的澄清/解释。 - Robert Groves
Robert,感谢您的解释。您是否也知道size_t在哪里声明?我已经查看了sys/types.h、stdio.h和stdlib.h,但无法在我的系统上找到gcc 4.1的size_t定义。此外,我没有stddef.h。 - Jimm
size_t 应该在 stddef.h 中定义,用于 C 语言。(C++ 中使用 cstddef) - Robert Groves
4
你可以将结果转换为 int,因为 sizeof(int) 肯定适合于 int - R.. GitHub STOP HELPING ICE
2
@Jimm 是的,你确实有stddef.h -- 每个ANSI C系统都提供它。 - Jim Balter

4
您的问题在于size_t是一种无符号类型。尝试使用:
printf("The size of integer is %u\n", sizeof(n));

您需要消除那个警告。


1
请注意,此代码在 size_tunsigned int 长度不同的系统上无法移植。 - Jim Balter
@Jim Balter:确实,像在GCC上使用printf("The size of integer is %zu\n", sizeof(n));或者在MSVC上使用printf("The size of integer is %Iu\n", sizeof(n));这样的方式更具可移植性,但是我不知道如何为一般情况编写这样的代码。 - Aurojit Panda
由于 sizeof(int) 必须是一个小整数,因此在这种情况下使用 %u 和强制转换为 (unsigned) 即可。 - Jim Balter

-5

我认为你应该写成这样:

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

1
这仍然会返回警告 var.c:7: 警告:格式‘%d’期望类型为‘int’,但参数2具有类型‘long unsigned int’。 - Jimm
@SIFE 我很好奇你为什么认为这会产生不同的结果。 - Jim Balter
@Jim 如果我没有忘记,这是在C语言中查看类型大小的正确方法。 - SIFE
@SIFE sizeof(int)sizeof(n)(其中n被声明为int)具有相同的值。您似乎没有掌握这里的问题 - 请查看其他答案和评论以理解。 - Jim Balter
@Jim 我并没有说他错了,我只是说应该怎么写。 - SIFE
@SIFE 你有点困惑了,请阅读其他答案和评论。 - Jim Balter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接