我在Linux命令行中使用Nano编写了以下代码,以便在编译时出错:
我想知道我需要在代码中进行哪些更改才能使其正确编译。我试图让列出的每种数据类型的位数在一行上打印。
#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;
}
答案 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。