根据C89标准,我能相信sizeof(size_t) <= sizeof(unsigned long int)
总是如此吗?
即,如果我使用unsigned long
预期size_t
,我将不会放松,反之亦然。
答案 0 :(得分:3)
对size_t
和 C89 中的整数类型所发生的事情的最佳解释可能就是它的基本原理。请仔细阅读本文件的第3.4.4节:
Sizeof and size_t for C89 (rationale)
第3段说:
发布大小的类型(无论是什么)(在库中) header)as size_t,因为它对程序员很有用 能够参考这种类型。隐含地要求这个要求 将size_t限制为现有无符号整数的同义词 类型,从而取消了最大可声明对象的任何概念 可能太大了,即使是无符号长也可能超出范围。
这意味着,对于 C89 的关注,一般size_t
与预先存在的unsigned
整数类型相同,C89中的含义是{{{} 1}}。
特别是,unsigned char, unsigned short, unsigned int, unsigned long
类型的每个值都在size_t
范围内
通过阅读标准C89的规范,您还可以看到unsigned long
。
现在, C99 的情况略有不同。该标准说:
sizeof(size_t)<=sizeof(long)
是无符号整数类型。 size_t
[...]使用的类型的整数转换等级不应大于size_t
的整数转换等级6.2.5 par。 8对于具有相同签名和不同整数转换等级的任何两个整数类型(见6.3.1.1),具有较小整数转换等级的类型的值范围是另一种类型的值的子范围。
由于signed long int
的整数转换等级与signed long int
相同,这意味着unsigned long int
的值范围包含在size_t
的范围内值unsigned long int
。
但是上面列表中的第3项为此规则的例外打开了大门。
因此,我们只能说实现强烈要求size_t
的值保持在unsigned long int
的范围内。但我们不能完全确定。
如果您想确定,可以执行以下步骤来检查您的系统:
<limits.h>
和<stdint.h>
,以便访问有关实施的整数类型的信息。 ULONG_MAX
(来自<limits.h>
)和SIZE_MAX
(来自<stdint.h>
)。一个简短的计划是:
#include <stdio.h>
#include <limits.h>
#include <stdint.h>
int main(void) {
printf("Is the range of size_t containd in that of unsigned long?\n\n");
if (SIZE_MAX <= ULONG_MAX)
printf("Yes");
else
printf("No");
return 0;
}
答案 1 :(得分:1)
According to the 1999 ISO C standard (C99), size_t is an unsigned integer type of at least 16 bit (see sections 7.17 and 7.18.3).
所以sizeof(size_t) <= sizeof(unsigned long int)
是正确的,但sizeof(size_t) > sizeof(unsigned long int)
不正确,可能会导致数据丢失。例如:
size_t a = b;
如果b
为unsigned long int
,则可能会导致数据丢失,因为其值可能大于size_t
可以容纳的值。