2

sizeof(size_t) <= sizeof(unsigned long int)根据 C89 标准,我可以相信总是正确的吗?

unsigned long即,如果我使用预期的位置,我不会失去价值,size_t反之亦然。

4

2 回答 2

3

也许对C89size_t中整数类型的最佳解释是它的基本原理文档。仔细阅读本文档的第 3.4.4 节:

C89 的 sizeof 和 size_t(基本原理)

第 3 段说:

sizeof 的类型,无论它是什么,都作为 size_t 发布(在库头中),因为程序员能够引用这种类型很有用。此要求隐含地将 size_t 限制为现有无符号整数类型的同义词,从而消除了最大可声明对象可能太大而无法跨越即使使用无符号长整数类型的任何想法。

这意味着,对于C89的关注,通常size_t与预先存在的unsigned整数类型相同,在 C89 中意味着unsigned char, unsigned short, unsigned int, unsigned long.
特别是,type 的每个值size_t都在 的范围内unsigned long
通过阅读标准 C89 的规格,您还可以看到sizeof(size_t)<=sizeof(long).


现在,C99的情况有些不同。这个标准说:

  1. 7.17 标准杆。2size_t是无符号整数类型。
  2. 7.17 标准杆。4 用于size_t[...] 的类型的整数转换等级不应大于signed long int
  3. --------- 除非实现支持足够大的对象以使其成为必要。
  4. 6.2.5 标准杆。8 对于任何两个具有相同符号和不同整数转换等级的整数类型(见 6.3.1.1),具有较小整数转换等级的类型的值范围是另一个类型的值的子范围。

    由于 的整数转换等级signed long int相同unsigned long int,这意味着 的值范围size_t包含在 的值范围内unsigned long int。但是上面列表中的第 3 项为该规则的例外情况敞开了大门。

因此,我们只能说,实现使size_t保持值在unsigned long int. 但我们不能完全确定

如果您想确定,您可以执行以下过程来检查您的系统:

  1. 包含这些文件<limits.h><stdint.h>以便为您的实现访问有关整数类型的信息。
  2. 比较常数ULONG_MAX(from <limits.h>) 和SIZE_MAX(from <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;
 }
于 2013-10-12T05:06:14.267 回答
2

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如果是 a可能会导致数据丢失,unsigned long int因为它的值可能大于size_t可以容纳的值。

于 2013-10-12T02:44:37.060 回答