c - 为什么int的范围是-32768到32767?

标签 c visual-studio integer turbo-c

为什么任何数据类型的负值范围都比正值值大?

例如,如果是整数:

Turbo C 中它的范围是 -3276832767 而对于 Visual Studio 它是 -21474836482147483647

其他数据类型也是如此。

最佳答案

由于数字的存储方式。有符号数使用称为“二进制补码表示法”的东西存储。

记住所有变量都有一定数量的位。如果其中最重要的一位(左边的一位)是 0,则该数字是非负数(即正数或零),其余位仅表示值。

但是,如果最左边的位是 1,则该数为负数。数字的实际值可以通过从表示的整数(作为无符号数,包括最左边的 1)中减去 2^n 来获得,其中 n 是变量的位数。

由于数字的实际值(“尾数”)只剩下 n - 1 位,因此可能的组合为 2^(n - 1)。对于正数/零数,这很简单:它们从 0 到 2^(n - 1) - 1。-1 是为了说明零本身——例如,如果你只有四种可能的组合,这些组合将代表 0、1、2 和 3(注意有四个数字):它从 0 到 4 - 1。

对于负数,请记住最左边的位是 1,因此表示的整数介于 2^(n - 1) 和 (2^n) - 1 之间(括号在这里非常重要!)。但是,正如我所说,您必须去掉 2^n 才能获得数字的实际值。 2^(n - 1) - 2^n 是 -(2^(n - 1)),而 ((2^n) - 1) - 2^n 是 -1。因此,负数的范围是-(2^(n - 1)) 到-1。

将所有这些放在一起,您得到 -2^(n - 1) 到 2^(n - 1) - 1。如您所见,上限得到 -1 而下限没有。

这就是负数比正数多一个的原因。

关于c - 为什么int的范围是-32768到32767?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18558271/

相关文章:

windows - 视觉小尺寸语言

python - 如何将字典中的值从字符串转换为整数

Javascript:如何截取整数的一部分?

java - 在 Java 中打印整数数组的唯一值的总和

c - 文件部分用c发送

c# - 在 visual studio 2013 中进行备份的最简单方法是什么?

linux - 如何在 Windows 上的 Visual Studio 中编写 CUDA 并将其部署到 Linux?

c - 使用 C 从服务器获取和存储图像的 HTTP 客户端

C 旋转位域(需要解释)

我可以使用列表重置数组值吗?