从命令行使用sizeof编译C代码的错误

时间:2017-05-17 01:36:55

标签: c linux command sizeof nano

我在Linux命令行中使用Nano编写了以下代码,以便在编译时出错:

Warnings when compiling

我想知道我需要在代码中进行哪些更改才能使其正确编译。我试图让列出的每种数据类型的位数在一行上打印。

#include<stdio.h>

int main(void){
    char A;
    unsigned char B;
    int a;
    unsigned int b;
    long c;
    unsigned long d;
    float e;
    double f;
    long double g;

    printf(
        "%c %c %i %u %li %lu %f %lf %Lf\n",
         sizeof(char), sizeof(unsigned char),
         sizeof(int), sizeof(unsigned int),
         sizeof(long), sizeof(unsigned long),
         sizeof(float), sizeof(double), sizeof(long double)
    );

    return 0;
}

2 个答案:

答案 0 :(得分:2)

sizeof运算符返回size_t类型的整数,因此您应该使用适当的printf格式说明符("%zu")(假设为C99):

printf(
    "%zu %zu %zu %zu %zu %zu %zu %zu %zu\n",
     sizeof(char), sizeof(unsigned char),
     sizeof(int), sizeof(unsigned int),
     sizeof(long), sizeof(unsigned long),
     sizeof(float), sizeof(double), sizeof(long double)
);

但是,这会在每种类型中打印 bytes 的数量。如果您想要每种类型中的数量,请添加<limits.h>并将每个结果乘以CHAR_BIT以获得该值:

#include <limits.h>

/* ... */

printf(
    "%zu %zu %zu %zu %zu %zu %zu %zu %zu\n",
     sizeof(char) * CHAR_BIT, sizeof(unsigned char) * CHAR_BIT,
     sizeof(int) * CHAR_BIT, sizeof(unsigned int) * CHAR_BIT,
     sizeof(long) * CHAR_BIT, sizeof(unsigned long) * CHAR_BIT,
     sizeof(float) * CHAR_BIT, sizeof(double) * CHAR_BIT, sizeof(long double) * CHAR_BIT
);

IMO,如果您标记要打印的内容并在各自的行上打印每个值,它会更清晰,如下所示:

printf("Number of bits in char = %zu\n", sizeof(char) * CHAR_BIT);
printf("Number of bits in unsigned char = %zu\n", sizeof(unsigned char) * CHAR_BIT);
printf("Number of bits in int = %zu\n", sizeof(int) * CHAR_BIT);
printf("Number of bits in unsigned int = %zu\n", sizeof(unsigned int) * CHAR_BIT);
printf("Number of bits in long = %zu\n", sizeof(long) * CHAR_BIT);
printf("Number of bits in unsigned long = %zu\n", sizeof(unsigned long) * CHAR_BIT);
printf("Number of bits in float = %zu\n", sizeof(float) * CHAR_BIT);
printf("Number of bits in double = %zu\n", sizeof(double) * CHAR_BIT);
printf("Number of bits in long double = %zu\n", sizeof(long double) * CHAR_BIT);

可以用宏来减少(尽管宏不是最好的,它们对重复代码很有用):

#define PRINT_BITS_IN_TYPE(type) \
    printf("Number of bits in " #type " = %zu\n", sizeof(type) * CHAR_BIT)

PRINT_BITS_IN_TYPE(char);
PRINT_BITS_IN_TYPE(unsigned char);
PRINT_BITS_IN_TYPE(int);
PRINT_BITS_IN_TYPE(unsigned int);
PRINT_BITS_IN_TYPE(long);
PRINT_BITS_IN_TYPE(unsigned long);
PRINT_BITS_IN_TYPE(float);
PRINT_BITS_IN_TYPE(double);
PRINT_BITS_IN_TYPE(long double);

答案 1 :(得分:0)

这是因为unsigned char被提升为int(在普通的C实现中),因此将int传递给printf以获取指定符%c。但是,%c需要unsigned int,因此类型不匹配,并且C标准不定义行为。 您可以执行以下方法: 1)尝试使用C11(标准版)。 2)尝试使用%zu。