首页 > 编程语言 >C++学习------cstdint头文件的源码学习02---宏定义

C++学习------cstdint头文件的源码学习02---宏定义

时间:2022-11-17 22:03:28浏览次数:38  
标签:02 INT32 MIN INT MAX --- 源码 INT64 define

续接上文讲解

常见整型的上下限

这里事先定义了如下整形的上下限

占用位数

有符号/无符号

上限

下限

8

有符号

127

-128

8

无符号

255

0

16

有符号

32767

-32768

16

无符号

65535

0

32

有符号

2147483647

-2147483647-1

32

无符号

4294967295U

0

64

有符号

INT64_C(9223372036854775807)

INT64_C(-9223372036854775807)-1

64

无符号

UINT64_C(18446744073709551615)

0

注意:这里用到了一些宏定义,我们在后面一节里面会说明它的含义

154  #define INT8_MIN         (-128)
155 #define INT8_MAX (127)
156 #define INT_LEAST8_MIN INT8_MIN
157 #define INT_LEAST8_MAX INT8_MAX
158 #define INT_FAST8_MIN INT8_MIN
159 #define INT_FAST8_MAX INT8_MAX
160
161 #define UINT8_MAX (255)
162 #define UINT_LEAST8_MAX UINT8_MAX
163 #define UINT_FAST8_MAX UINT8_MAX
164
165 #define INT16_MIN (-32768)
166 #define INT16_MAX (32767)
167 #define INT_LEAST16_MIN INT16_MIN
168 #define INT_LEAST16_MAX INT16_MAX
169 #define INT_FAST16_MIN INT32_MIN
170 #define INT_FAST16_MAX INT32_MAX
171
172 #define UINT16_MAX (65535)
173 #define UINT_LEAST16_MAX UINT16_MAX
174 #define UINT_FAST16_MAX UINT32_MAX
175
176 #define INT32_MIN (-2147483647-1)
177 #define INT32_MAX (2147483647)
178 #define INT_LEAST32_MIN INT32_MIN
179 #define INT_LEAST32_MAX INT32_MAX
180 #define INT_FAST32_MIN INT32_MIN
181 #define INT_FAST32_MAX INT32_MAX
182
183 #define UINT32_MAX (4294967295U)
184 #define UINT_LEAST32_MAX UINT32_MAX
185 #define UINT_FAST32_MAX UINT32_MAX
186
187 #define INT64_MIN (INT64_C(-9223372036854775807)-1)
188 #define INT64_MAX (INT64_C(9223372036854775807))
189 #define INT_LEAST64_MIN INT64_MIN
190 #define INT_LEAST64_MAX INT64_MAX
191 #define INT_FAST64_MIN INT64_MIN
192 #define INT_FAST64_MAX INT64_MAX
193 #define UINT64_MAX (UINT64_C(18446744073709551615))
194
195 #define UINT_LEAST64_MAX UINT64_MAX
196 #define UINT_FAST64_MAX UINT64_MAX
197
198 #define INTMAX_MIN INT64_MIN
199 #define INTMAX_MAX INT64_MAX
200 #define UINTMAX_MAX UINT64_MAX
201
202 #define SIG_ATOMIC_MAX INT32_MAX
203 #define SIG_ATOMIC_MIN INT32_MIN
204
205 #if defined(__WINT_UNSIGNED__)
206 # define WINT_MAX UINT32_MAX
207 # define WINT_MIN 0
208 #else
209 # define WINT_MAX INT32_MAX
210 # define WINT_MIN INT32_MIN
211 #endif
212
213 #if defined(__LP64__)
214 # define INTPTR_MIN INT64_MIN
215 # define INTPTR_MAX INT64_MAX
216 # define UINTPTR_MAX UINT64_MAX
217 # define PTRDIFF_MIN INT64_MIN
218 # define PTRDIFF_MAX INT64_MAX
219 # define SIZE_MAX UINT64_MAX
220 #else
221 # define INTPTR_MIN INT32_MIN
222 # define INTPTR_MAX INT32_MAX
223 # define UINTPTR_MAX UINT32_MAX
224 # define PTRDIFF_MIN INT32_MIN
225 # define PTRDIFF_MAX INT32_MAX
226 # define SIZE_MAX UINT32_MAX
227 #endif

与之前不同,这里的fast值和least值的max和min定义大部分与对应的基础值一样,不一样的是:

#define INT_FAST16_MIN   INT32_MIN
#define INT_FAST16_MAX INT32_MAX

定义为INT32_MIN和INT32_MAX 同时,其它的一些size,如SIG_ATOMIC_MAX(原子量),WINT_MAX(根据是否有符号进行区分),PTRDIFF_MAX(指针运算差值)SIZE_MAX(size_t的取值)

类型转换宏

实际上是运用了字面值常量的前后缀来生成宏:

  • u或U,最小匹配unsigned
  • l或L,最小匹配long
  • ll或LL,最小匹配long long
106  /* Keep the kernel from trying to define these types... */
107 #define __BIT_TYPES_DEFINED__
108
109 #define INT8_C(c) c
110 #define INT_LEAST8_C(c) INT8_C(c)
111 #define INT_FAST8_C(c) INT8_C(c)
112
113 #define UINT8_C(c) c
114 #define UINT_LEAST8_C(c) UINT8_C(c)
115 #define UINT_FAST8_C(c) UINT8_C(c)
116
117 #define INT16_C(c) c
118 #define INT_LEAST16_C(c) INT16_C(c)
119 #define INT_FAST16_C(c) INT32_C(c)
120
121 #define UINT16_C(c) c
122 #define UINT_LEAST16_C(c) UINT16_C(c)
123 #define UINT_FAST16_C(c) UINT32_C(c)
124 #define INT32_C(c) c
125 #define INT_LEAST32_C(c) INT32_C(c)
126 #define INT_FAST32_C(c) INT32_C(c)
127
128 #define UINT32_C(c) c ## U
129 #define UINT_LEAST32_C(c) UINT32_C(c)
130 #define UINT_FAST32_C(c) UINT32_C(c)
131 #define INT_LEAST64_C(c) INT64_C(c)
132 #define INT_FAST64_C(c) INT64_C(c)
133
134 #define UINT_LEAST64_C(c) UINT64_C(c)
135 #define UINT_FAST64_C(c) UINT64_C(c)
136
137 #define INTMAX_C(c) INT64_C(c)
138 #define UINTMAX_C(c) UINT64_C(c)
139
140 #if defined(__LP64__)
141 # define INT64_C(c) c ## L
142 # define UINT64_C(c) c ## UL
143 # define INTPTR_C(c) INT64_C(c)
144 # define UINTPTR_C(c) UINT64_C(c)
145 # define PTRDIFF_C(c) INT64_C(c)
146 #else
147 # define INT64_C(c) c ## LL
148 # define UINT64_C(c) c ## ULL
149 # define INTPTR_C(c) INT32_C(c)
150 # define UINTPTR_C(c) UINT32_C(c)
151 # define PTRDIFF_C(c) INT32_C(c)
152 #endif

所以,上面的匹配中,针对32位机器的无符号64位表示为: ​​# define UINT64_C(c) c ## ULL​

"##"在宏定义中代表将前后以字符相连,即一个数字将表示为cULL,即该字面值为unsigned long long类型

回到之前我们定义上下限的位置,​​UINT64_C(18446744073709551615)​​在编译时就被表示为18446744073709551615ULL。

总结

stdint.h头文件中定义是为了兼容32位和64位机器,保证使用对应的定义能够获取对应位数的变量,平时我们在编程时,也需要多加考虑程序在多个平台之间的可移植性,尽量使用与平台无关的变量定义,如使用int32_t代替int。

标签:02,INT32,MIN,INT,MAX,---,源码,INT64,define
From: https://blog.51cto.com/u_15830688/5866197

相关文章