在C语言中数据类型的长度,有无符号等常常是机器相关,编译器相关的。
比如说:int在32位机上长度是32位,但是在51单片机上长度是16位。
本程序用宏实现了标准C语言整型数据的机器无关,编译器无关。
/* Int.h */
#ifndef INT_H
#define INT_H
#include <limits.h>
#if 0XFF == UCHAR_MAX
typedef signed char SInt8;
typedef unsigned char UInt8;
#elif 0XFF == USHRT_MAX
typedef signed short SInt8;
typedef unsigned short UInt8;
#elif 0XFF == UINT_MAX
typedef signed int SInt8;
typedef unsigned int UInt8;
#elif 0XFF == ULONG_MAX
typedef signed long SInt8;
typedef unsigned long UInt8;
#else
#ifdef ULLONG_MAX
#if 0XFF == ULLONG_MAX
typedef signed long long SInt8;
typedef unsigned long long UInt8;
#endif
#endif
#endif
#if 0XFFFF == UCHAR_MAX
typedef signed char SInt16;
typedef unsigned char UInt16;
#elif 0XFFFF == USHRT_MAX
typedef signed short SInt16;
typedef unsigned short UInt16;
#elif 0XFFFF == UINT_MAX
typedef signed int SInt16;
typedef unsigned int UInt16;
#elif 0XFFFF == ULONG_MAX
typedef signed long SInt16;
typedef unsigned long UInt16;
#else
#ifdef ULLONG_MAX
#if 0XFFFF == ULLONG_MAX
typedef signed long long SInt16;
typedef unsigned long long UInt16;
#endif
#endif
#endif
#if 0XFFFFFFFF == UCHAR_MAX
typedef signed char SInt32;
typedef unsigned char UInt32;
#elif 0XFFFFFFFF == USHRT_MAX
typedef signed short SInt32;
typedef unsigned short UInt32;
#elif 0XFFFFFFFF == UINT_MAX
typedef signed int SInt32;
typedef unsigned int UInt32;
#elif 0XFFFFFFFF == ULONG_MAX
typedef signed long SInt32;
typedef unsigned long UInt32;
#else
#ifdef ULLONG_MAX
#if 0XFFFFFFFF == ULLONG_MAX
typedef signed long long SInt32;
typedef unsigned long long UInt32;
#endif
#endif
#endif
#if 0XFFFFFFFFFFFFFFFF == UCHAR_MAX
typedef signed char SInt64;
typedef unsigned char UInt64;
#elif 0XFFFFFFFFFFFFFFFF == USHRT_MAX
typedef signed short SInt64;
typedef unsigned short UInt64;
#elif 0XFFFFFFFFFFFFFFFF == UINT_MAX
typedef signed int SInt64;
typedef unsigned int UInt64;
#elif 0XFFFFFFFFFFFFFFFF == ULONG_MAX
typedef signed long SInt64;
typedef unsigned long UInt64;
#else
#ifdef ULLONG_MAX
#if 0XFFFFFFFFFFFFFFFF == ULLONG_MAX
typedef signed long long SInt64;
typedef unsigned long long UInt64;
#endif
#endif
#endif
#endif
/* Test.c */
#include "Int.h"
#include <stdio.h>
int main(int argc, char *argv[])
{
printf("sizeof(SInt8) * CHAR_BIT = %d/n", sizeof(SInt8) * CHAR_BIT); /* 8 */
printf("sizeof(UInt8) * CHAR_BIT = %d/n", sizeof(UInt8) * CHAR_BIT); /* 8 */
printf("sizeof(SInt16) * CHAR_BIT = %d/n", sizeof(SInt16) * CHAR_BIT); /* 16 */
printf("sizeof(UInt16) * CHAR_BIT = %d/n", sizeof(UInt16) * CHAR_BIT); /* 16 */
printf("sizeof(SInt32) * CHAR_BIT = %d/n", sizeof(SInt32) * CHAR_BIT); /* 32 */
printf("sizeof(UInt32) * CHAR_BIT = %d/n", sizeof(UInt32) * CHAR_BIT); /* 32 */
printf("sizeof(SInt64) * CHAR_BIT = %d/n", sizeof(SInt64) * CHAR_BIT); /* 64 */
printf("sizeof(UInt64) * CHAR_BIT = %d/n", sizeof(UInt64) * CHAR_BIT); /* 64 */
return 0;
}
呵呵,以后写程序可以实现整型数据的机器无关,编译器无关了。