用于确定有符号和无符号数据类型C++的范围的公式

Formula to determine the range of signed and unsigned data types C++

本文关键字:C++ 范围 数据类型 无符号 符号 用于      更新时间:2023-10-16

我刚开始学习C++(实际上是我的第二天),我被指派计算不同数据类型的范围,有符号和无符号。问题是,按照我学校的运作方式,我在接下来的几个月里都无法进入他教我们公式的数学部分。他说,要从已经上过数学课的人那里获得信息,但他们都说,他们将在家里做这方面的工作,那里有他们的笔记。所以,现在我被谷歌及其不确定的答案蒙在鼓里,所以我问你们,斯塔克夫弗洛的智者。

获取数据类型范围的公式是什么?我为INT找到了一个有效但不适用于其他的,他希望我们计算的是:char、short、long和long-long。他还想要这4以及INT.的未签名版本

我们已经掌握了每种数据类型的大小(以位和字节为单位)。

以下是我的INT范围布局:

    printf ("nThe range of int is: %fn", pow(2, (sizeof(int) * CHAR_BIT) -1));

std::numeric_limits<T>

您可以使用以下函数获得这些限制的实际值:

  • T std::numeric_limits<T>::min()
  • T std::numeric_limits<T>::max()

可以用适当的类型代替T,例如signed charunsigned char

公式

具有N位的有符号数(使用2的补码)的公式是

  • min=-1*2N-1
  • max=2N-1-1

具有N位的无符号数的公式是

  • 最小值=0
  • max=2N-1

示例:8位char

CCD_ 8具有N=8个比特。让我们用signed charunsigned char来验证这些公式。

  • signed char
    • min=-1*2N-1=-1*27=-128
    • max=2N-1-1=27-1=127
  • unsigned char
    • 最小值=0
    • max=2N-1=28-1-255

实际上,这些范围可以在<limits>中找到-请参阅参考,特别是模板std::numeric_limits-请参阅此处。不过,我假设你想知道这些数字是从哪里来的。

重要的是比特的数量。如果您有n位,那么您可以用它们来表示2n不同的值。取一个老派的16位整数。对于16位,可能的不同值的数量是216=65536。如果你有一个无符号的值,你只表达非负值。因此,您表示的最小值是0,最大值是2n-1,因此一个16位无符号整数从0变为65535

如果用符号表示整数,那么现在当然有相同数量的值(上一个例子中为65536)来表示一些正数和负数。在中间有0,然后将剩余的值分为负值和正值。所以你在低端得到-32768,在高端得到32767

对于任何其他表示整数的数据类型,无论是32位、64位还是更多位,都是相同的模式。