c与编译器、环境无关的整数类型(c99标准)
c语言标准只规定了各种整型的最小范围,却并未给出具体值。
这使得我们对数据类型范围的任何假设都有可能造成不可预知的错误。
所以,c99给出了一系列确定长度的整数类型,如下。
这些类型的宏定义在头文件stdint.h中
这些类型的输入输出格式符的宏定义在头文件inttypes.h中
一、 stdint.h
定义义了如下类型,int代表有符号,uint代表无符号,_t前的数字代表类型占用内存的位数,例如int16_t代表16位有符号整型。(char其实也是整型,在不同的编译器实现中,char有的有的对应着int8_t,有的对应着uint8_t)
int8_t int16_t int32_t int64_t
uint8_t uint16_t uint32_t uint64_t
定义了如下宏,具体什么含义,顾名思义。
INTN_MIN, UINTN_MIN, INTN_MAX, UINTN_MAX ;
INT_LEASEN_MIN, INT_LEASEN_MAX ;
INT_FASTN_MIN, INT_FASTN_MAX ;
二、 inttypes.h中
(以下以64位有符号数举例,其他类型以此类推)
1.遵循gcc标准的系统中,例如debian上的gcc:
头文件中宏定义如下
#define PRId64 "lld"
#define SCNd64 "lld"
使用例子如下
#include <stdint.h>
int64_t a;
#include <inttypes.h>
scanf("%"SCNd64, &a);
printf("%"PRId64 , a);
printf("%"PRId64"\n", a);
2.vc或windows移植的gcc
头文件中宏定义如下
#define PRId64 "I64d"
#define SCNd64 "I64d"
使用的例子如下
#include <stdint.h>
int64_t a;
#include <inttypes.h>
scanf("%"SCNd64, &a);
printf("%"PRId64 , a);
printf("%"PRId64"\n", a);
ps:对c语言来说 “hello” “world” 和 “hello”“world” 和 "helloworld"是等价的,这对理解上面面的宏很有必要。
ps:真正头文件中的宏定义比这复杂的多,我这样写是简化的版本,为了方便理解。