13

我刚开始使用 C++(实际上是我的第二天),我被分配计算各种数据类型(有符号和无符号)的范围。问题是,我学校的工作方式我不会去数学部分,他再教我们几个月的公式。他说要从已经完成数学课程的人那里获取信息,但是他们所有人都说他们将在家里做这件事,他们有笔记。所以现在我对谷歌及其不确定的答案一无所知,所以我问你,stackoverflow 的聪明人。

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

我们已经有了这些数据类型的位和字节大小。

以下是我的 INT 范围布局方式:

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

2 回答 2

23

std::numeric_limits<T>

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

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

公式

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

  • 最小值 = -1 * 2 N - 1
  • 最大值 = 2 N - 1 - 1

N位无符号数的公式是

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

示例:8 位char

charN = 8 位。signed char让我们用和验证这些公式unsigned char

  • signed char
    • 最小值 = -1 * 2 N - 1 = -1 * 2 7 = -128
    • 最大值 = 2 N - 1 - 1 = 2 7 - 1 = 127
  • unsigned char
    • 最小值 = 0
    • 最大值 = 2 N - 1 = 2 8 - 1 = 255
于 2013-08-07T19:43:39.443 回答
3

实际上,这些范围可以在<limits>- 请参阅参考资料,特别是模板std::numeric_limits- 请参阅此处。我假设您想知道这些数字来自哪里。

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

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

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

于 2013-08-07T19:50:53.627 回答