C/C++中的size_t数据类型

时间:2020-02-23 14:30:04  来源:igfitidea点击:

在本文中,我们将了解C/C++中的size_t数据类型。

当您遇到许多C/C++库函数的函数原型时,您可能想知道它的确切含义。

让我们通过一些示例来了解它的含义!

C/C++中的size_t数据类型

本质上,size_t是无符号数据类型。
这意味着它不能为负。

size_t value; //value will never be negative

它可以存储任何数据类型的最大大小。
因此,当您可能通过unsigned int遇到32位整数的问题时,它适用于64位系统。

当您使用int进行计数时,您的值可能会溢出并且为负!

以下面的示例为例,由于溢出,我们的整数变量突然变为<0!

#include <stdio.h>

int main() {
  //Initially set to 0
  int count = 0;

  while (count >= 0) {
      count ++;
      if (count < 0) {
          printf("Overflow Detected! Count is now %d\n", count);
      }
  }
  return 0;
}

您可能需要等待几秒钟才能看到输出。

输出

Overflow Detected! Count is now -2147483648

如您所见,由于溢出,我们的count整数变量为负!

虽然一种方法是对我们的整数变量进行检查,但是使用始终为非负数的无符号数据类型通常非常方便。

C标准将" size_t"作为一种这样的数据类型。
这将确保我们所计算的结果不会是负面的。
例如,如果您要跟踪数组索引,这将非常有用。

这就是为什么像strlen()这样的函数返回一个size_t值的原因。

使用size_t的警告

虽然这是确保我们的变量保持非负数的很好的数据类型,但如果要处理减法,它可能不起作用。

例如,考虑下面的代码示例,该示例试图找出两个size_t变量的差。

#include <stdio.h>

int main() {
  size_t a = 1000;
  size_t b = 5000;

  //Observe the output!
  printf("Difference between %lu and %lu = %lu", a, b, a - b);

  return 0;
}

在运行上面的代码时,您可能会得到类似于以下内容的信息:

输出

Difference between 1000 and 5000 = 18446744073709547616

为什么会发生这种情况?

由于两个有符号数之间的减法与两个有符号整数之间的减法不同,因此我们得到了意外的输出。

在这种情况下,最好的解决方案是使它们成为整数,然后计算差值。

类似于溢出int,我们也有size_t类似的情况。

因此,请确保根据要解决的问题选择变量的数据类型。