我可以信任sizeof(size_t)< = sizeof(unsigned long int)总是如此吗?

时间:2013-10-12 02:33:12

标签: c size-type

根据C89标准,我能相信sizeof(size_t) <= sizeof(unsigned long int)总是如此吗?

即,如果我使用unsigned long预期size_t,我将不会放松,反之亦然。

2 个答案:

答案 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 的情况略有不同。该标准说:

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

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

  5. 因此,我们只能说实现强烈要求size_t的值保持在unsigned long int的范围内。但我们不能完全确定

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

    1. 包含文件<limits.h><stdint.h>,以便访问有关实施的整数类型的信息。
    2. 比较常量ULONG_MAX(来自<limits.h>)和SIZE_MAX(来自<stdint.h>)。
    3. 一个简短的计划是:

       #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;
如果bunsigned long int,则

可能会导致数据丢失,因为其值可能大于size_t可以容纳的值。