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 }