在c中打印基本数据类型的范围

时间:2013-09-24 12:29:25

标签: c

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

3 个答案:

答案 0 :(得分:1)

你有几个问题:

d用于签名整数。

u用于无符号整数。

charshort被提升为int。不要向其添加lll

使用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的参数数量是错误的。编译时是否启用了警告?如果没有,你应该。绝对不要忽视警告。