2013-09-24 76 views
-4

我試圖解決在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和無符號整型值和長都錯了是更新。

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

你究竟是什麼意思的行「價值被搞砸了」?你擔心輸出的佈局嗎? – nikoo28

+0

抱歉,我的意思是錯誤的。 – programer8

回答

1

你有幾個問題:

使用d符號整數。

對於無符號整數使用u

charshort被提升爲int。不要將lll添加到他們。

llong類型,而不是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

+0

但是如果我從long_max中減去long_min,那會導致long的右邊溢出? – programer8

+0

@ programer8嗯,是的。但與您在輸出中獲得的值無關。 – user694733

+0

我確實得到you.i修改程序,但從int uint和long的值是錯誤的 – programer8

0

man 3 printf(或this)會給你的格式代碼對所有整數類型。您會發現您的大部分結果都使用了錯誤的結果,例如您使用"%li"代替int,而不是"%d"。此外,從最大值減去最小值的結果通常不能用相同的整數數據類型表示,並且需要強制轉換。

+0

嘿,我不是在談論格式。但是這有幫助。我是說價值觀是錯誤的,你能指出我從哪一個中減去較小的數字? – programer8

+0

我不是在談論格式化!您無法使用長整數格式代碼打印整數。你會看到不同的價值!我沒有說你的減法是錯誤的,但是結果不能用這種類型表示。 – nickie

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的參數數量是錯誤的。你是否啓用了警告編譯?如果沒有,你應該。絕對不要忽視警告。

+0

是的,我改變了這部分的代碼,但這種幫助。 – programer8

+0

我得到的值int -1 127 255和uint給了我最大值4294967295和浮動不會顯示最小值 – programer8