-4

我正在尝试解决在 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);
4

3 回答 3

1

你有几个问题:

用于d有符号整数。

用于u无符号整数。

charshort晋升为int。不要添加ll或添加l到它们。

添加类型,而l不是.longll

编辑:

澄清:

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.

于 2013-09-24T12:49:56.843 回答
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是错误的。您是否在启用警告的情况下进行编译?如果没有,你应该。绝对不要忽视警告。

于 2013-09-24T13:27:42.600 回答
0

man 3 printf(或this)将为您提供所有整数类型的格式代码。您会看到您在大多数结果中使用了错误的结果,例如,您使用"%li"的是int, 而不是"%d". 此外,从最大值减去最小值的结果通常无法在相同的整数数据类型中表示,需要强制转换。

于 2013-09-24T12:34:37.963 回答