我正在尝试解决在C中打印基本数据类型范围的问题。
但我看到价值观是错误的。任何人都可以指出我的错误?
#include<stdio.h>
#include<limits.h>
#include<float.h>
main()
{
FILE *fp=fopen("/*path to the file*/","w");
fprintf(fp,"Printing the ranges for data types:\n");
fprintf(fp,"Type Min_Value Max_Value Range\n");
fprintf(fp,"*************************************************************************************************************************************************\n");
fprintf(fp,"char %4d %4d%4d\n\n",CHAR_MIN,CHAR_MAX,CHAR_MAX-CHAR_MIN);
fprintf(fp,"uchar 0 %4d %4d\n\n",UCHAR_MAX,UCHAR_MAX);
fprintf(fp,"schar %d %4d %4d\n\n",SCHAR_MIN,SCHAR_MAX,SCHAR_MAX-SCHAR_MIN);
fprintf(fp,"int %li %li %lu\n\n",(INT_MIN,INT_MAX,INT_MAX-INT_MIN));
fprintf(fp,"uint %d %lu %u\n\n",0,UINT_MAX,UINT_MAX);
fprintf(fp,"long %lli %llu %llu\n\n",LONG_MIN,LONG_MAX,LONG_MAX-LONG_MIN);
fprintf(fp,"ulong %ll %ll %lu\n\n",0,ULONG_MAX,ULONG_MAX);
fprintf(fp,"short %ll %ll %ld\n\n",SHRT_MIN,SHRT_MAX,SHRT_MAX-SHRT_MIN);
fprintf(fp,"ushort %ld %ll %ld\n\n",0,USHRT_MAX,USHRT_MAX);
fclose(fp);
}
这是输出
Printing the ranges for data types:
Type Min_Value Max_Value Range
*************************************************************************************************************************************************
char -128 127 255
uchar 0 255 255
schar -128 127 255
int -1 127 255
uint 0 4294967295 4294967295
long 9223372034707292160 18047113275375615 18047512710020968
ulong 0
short -32768
ushort 0 65535
更新代码并使用格式说明符之后,int和unsigned int和long的值在这里是错误的更新。
printf("int %15d %15d %15u\n\n",INT_MIN,INT_MAX,INT_MAX-INT_MIN);
printf("uint %u %15u %15u\n\n",0,UINT_MAX,UINT_MAX);
printf("long %15l %15l %15lu\n\n",LONG_MIN,LONG_MAX,LONG_MAX-LONG_MIN);
答案 0 :(得分:1)
你有几个问题:
将d
用于签名整数。
将u
用于无符号整数。
char
和short
被提升为int
。不要向其添加ll
或l
。
使用l
类型添加long
,而不是ll
。
修改强>
澄清:
int == %d
unsigned int == %u
long == %ld
unsigned long == %lu
此外,您无法表示具有相同数据类型的有符号整数范围,您需要使用更大的类型。 INT_MAX-INT_MIN
无效。它必须是(long)INT_MAX-(long)INT_MIN
,您需要使用%ld
来显示它。如果sizeof int == sizeof long
,那么即使这样也行不通。
答案 1 :(得分:0)
man 3 printf
(或this)会为您提供所有整数类型的格式代码。您会发现大多数结果都使用了错误的结果,例如:您使用"%li"
代替int
,而不是"%d"
。此外,从最大值中减去最小值的结果通常不能在相同的整数数据类型中表示,并且需要进行转换。
答案 2 :(得分:0)
变化:
fprintf(fp,"int %li %li %lu\n\n",(INT_MIN,INT_MAX,INT_MAX-INT_MIN));
为:
fprintf(fp,"int %li %li %lu\n\n", INT_MIN,INT_MAX,INT_MAX-INT_MIN);
有趣的错误。您的编译器应该已经捕获它并且警告您printf
的参数数量是错误的。编译时是否启用了警告?如果没有,你应该。绝对不要忽视警告。