无法打印signed int类型的大小

时间:2014-04-16 21:28:05

标签: c++ c

为什么当我尝试这样做时:

#include <stdio.h>

int main()
{

    printf("Size of int: %d bytes\n",sizeof(int));

    return 0;
}

我明白了:

warning: format "%d" expects argmuments of int type, but the second argument is of type "long unsigned int..."

(?)

如果重要,我的操作系统是版本12.4的64位Ubuntu。 编译器是:GNU GCC编译器,IDE是Code :: Blocks。

为了好奇,我在另一台机器上运行相同的代码,运行一个可怜的Win7,结构也是64位,我得到的结果就是那个int的大小,而不是像上面那样的警告。

6 个答案:

答案 0 :(得分:9)

这是正确的方法:

printf("Size of int: %zu bytes\n", sizeof(int));

sizeof运算符生成类型为size_t的值,%zu是正确的转换规范,用于打印size_t类型的值。

如果你的编译器不支持c99或c11,你可以这样做:

printf("Size of int: %lu bytes\n", (unsigned long) sizeof(int));

答案 1 :(得分:0)

尝试:

printf("Size of int: %lu bytes\n", sizeof(int));

答案 2 :(得分:0)

printf("Size of int: %zd bytes\n",sizeof(int))

答案 3 :(得分:0)

sizeof会返回size_t类型,在某些情况下会大于int。由于错误的大小参数被printf拉出,这会弄乱堆栈。几乎可以肯定,在sizeof之后打印的任何参数都会看到不正确的结果。

答案 4 :(得分:0)

您可以转换值

printf("Size of int: %d bytes\n", (int)sizeof (int));

答案 5 :(得分:0)

sizeof会产生size_t。使用格式说明符“%zu”应该提供正确的格式:

printf("Size of int: "%zu bytes\n", sizeof(int));  

此格式说明符 符合C99 如果您没有C99兼容编译器,则可以将sizeof转换为unsigned int并使用“%lu”

printf("Size of int: "%lu bytes\n", (unsigned int)sizeof(int));    

如果 ,您使用 visual studios ,根据Microsoft的说法,格式正确size_t的说明符是%Iu

printf("Size of int: "%Iu bytes\n", sizeof(int));