1 /*yvals.h*/ 2 #define _YVALS_H_ 3 4 #define MYEDOM 33 5 #define MYERANGE 34 6 #define MYEFPOS 35 7 #define MYERRMAX 36 8 9 #define _ILONG 1 10 #define _CSIGN 1 11 #define _MBMAX 2
1 /*my_limits.h 8-bit version*/ 2 /* 3 * c中標量數據類型要以一種對每一個計算機體系結構都很天然的方式表示。 4 * 程序選擇效率更高的類型: 5 * #if VAL_MIN < INT_MIN || INT_MAX < VAL_MAX 6 * typedef long val_t; 7 * #else 8 * typedef int val_t; 9 * #endif 10 * 測試int型是否超過16位: 11 * #if (-1 + 0x0) >> 1 > 0x7fff 12 * //大於16爲則... 13 * #endif 14 * 15 * 整型常量:由一串數組組成(因此負數不是整型常量),包含8進制,16進制,能夠包含後綴標識類型。 16 * 常量表達式:僅僅只包含常量的表達式。 17 * 因此INT_MIN,-2147483648須要寫成-2147483647-1,由於-2147483648別當作常量表達式,由"-"和常量值2147483648組成。 18 * 對於"-",是對原值補碼進行取反加1操做。,因此整型常量2147483648(int型)會類型提高。 19 * printf("%d", -2147483648);會報warnning。但printf("%d", -2147483647-1);不會,由於按照上面常量表達式操做,能夠正確。 20 * 爲何按上述步驟操做,能夠從編譯器步驟看,詞法分析時,按詞掃描,掃描到數,肯定類型。 21 */ 22 #ifndef _MY_LIMITS_H_ 23 #define _MY_LIMITS_H_ 24 #ifndef _YVALS_H_ 25 #include "yvals.h" 26 #endif 27 28 #define MY_CHAR_BIT 8 29 #if _CSIGN 30 #define MY_CHAR_MAX 127 31 #define MY_CHAR_MIN (-127-1) 32 #else 33 #define MY_CHAR_MAX 255 34 #define MY_CHAR_MIN 0 35 #endif 36 37 #if _ILONG 38 #define MY_INT_MAX 2147483647 39 #define MY_INT_MIN (-2147483647-1) 40 #define MY_UINT_MAX 4294967295 41 #else 42 #define MY_INT_MAX 32767 43 #define MY_INT_MAX (-32767-1) 44 #define MY_UINT_MAX 65535 45 #endif 46 47 #define MY_LONG_MAX 2147483647 48 #define MY_LONG_MIN (-2147483647-1) 49 50 #define MY_MB_LEN_MAX _MBMAX 51 52 #define MY_SCHAR_MAX 127 53 #define MY_SCHAR_MIN (-127-1) 54 55 #define MY_SHRT_MAX 32767 56 #define MY_SHRT_MIN (-32767-1) 57 58 #define MY_UCHAR_MAX 255 59 #define MY_ULONG_MAX 4294967295 60 #define MY_USHRT_MAX 65535 61 #endif
1 /*my_t_limits.c*/ 2 #include <stdio.h> 3 #include "my_limits.h" 4 5 int main() 6 {//測試了部分,其餘相似 7 printf("CHAR_BIT = %2i MB_LEN_MAX = %2i\n\n", MY_CHAR_BIT, MY_MB_LEN_MAX); 8 printf("CHAR_MAX = %10i CHAR_MIN = %10i\n", MY_CHAR_MAX, MY_CHAR_MIN); 9 printf("SCHAR_MAX = %10i SCHAR_MIN = %10i\n", MY_SCHAR_MAX, MY_SCHAR_MIN); 10 printf("UCHAR_MAX = %10u\n\n", MY_UCHAR_MAX); 11 #if MY_CHAR_BIT < 8 || MY_CHAR_MAX < 127 || 0 < MY_CHAR_MIN || MY_CHAR_MAX != MY_SCHAR_MAX && MY_CHAR_MAX != MY_UCHAR_MAX 12 #error bad char properties 13 #endif 14 return 0; 15 }