如果一个C语言的有符号整型变量只使用22位进行存储,那么它所能存储的最小值是多少?

3

我正在学习数据分配,但有些困惑。

如果你正在寻找可以存储在特定位数的最小或最大值,那么数据类型是否重要?

无论是什么数据类型,能够在22个位中存储的最小或最大数字不都应该是22个1的正负数吗?这个问题的第一部分是否是一个干扰项?最小值难道不应该是-4194303吗?


1
当然可以。如果类型为float,如果它有22位容量,它可以表示的最小数字是多少? - wallyk
2
当然数据类型很重要。浮点数数据类型的范围比整数类型更广。或者你可以想出一些奇特的数据类型,只计算十位数、百位数或十的幂次方。当然,你会失去分辨率,但会获得更大的范围。 - Eugene Sh.
2
问题并不是非常清晰。我认为你的意思是标题要被解释为“带有1个符号位和21个值位的有符号整数类型可以表示的最小值是多少?”但与之相对的是“一个[更大]有符号整数的22个最低有效位能够表示的最小值是多少?”或者“一个32位的有符号整数,其表示中恰好有22位1被设置,它所能表示的最小值是多少?” - John Bollinger
1
请注意,INT_MINFLT_MIN使用不同的概念来表示“最小值”。 - Weather Vane
看最后一段,我猜测是“-2097152”。 - Weather Vane
这是一个红鲱鱼。一个符号位,留下21位用于数值。 - Hans Passant
4个回答

6
一个22位数据元素可以存储2^22个不同的值。这些值的含义是一种解释问题。编译器或某些硬件可能会施加这种解释,或者有程序员控制,并适用于特定的应用程序。
当然,一个简单的解释是将22位视为无符号整数,其值从0到(2^22)-1。两个补码有符号整数是同样比较复杂的解释。或者您(或编译器或CPU)可以将22位分成尾数和指数,并存储一系列十进制数。范围和精度取决于分配给尾数和指数的位数。
或者您可以拆分位并将其用于分数的分子和分母。事实上,还可以用于其他任何内容。
这些位的某些解释已内置于硬件中,某些由编译器或库实现,某些完全由程序员控制。并非所有编程语言都允许程序员以自然或有效的方式操作单个位,但有些语言确实如此。有时,使用高度不传统的二进制数据解释可以显著提高效率,但通常会牺牲可读性和可维护性。
因此,数据类型很重要。

一个合理的回答!然而,OP在标题中确实有短语“C signed integer type”。如果按字面意义解释,那么它将限制表示形式为C标准允许的其中一种:二补数(最有可能)或者是按位取反加1码(如果仍然被允许)。也许C标准还允许其他表示形式-我不知道。 - Adrian Mole
你甚至还没有接近过度回答它。标题只询问“有符号整数类型”,而不是“标准有符号整数类型”。因此,只要包括符号,它就可以允许任何表示任意整数值的位方案。 - Eric Postpischil

2
没有任何法律(人类、逻辑或自然的)规定,比特必须仅以一个比特表示2的0次方,另一个表示2的1次方,另一个表示2的2次方等模式来表示数字(而所表示的数字是这些值为1的比特的和)。我们可以选择如何使用比特来表示数字,包括:
- 比特确实使用了该模式,因此22个比特可以表示从0到2的22次方减1(即4194303)之间的任何数字。最小可表示的值为0。 - 比特大多数使用该模式,但被修改为一位比特代表-2的21次方而不是+2的21次方。这称为“二进制补码”,最小可表示的值为-2的21次方(即-2097152)。 - 比特按上述方式表示数字,但所表示的值除以1000。这称为“定点数”。在第一种情况下,所有比特均为1时表示的值将为4194.303,但最小可表示的值为0。通过结合二进制补码和缩放1/1000的定点数,最小可表示的值将为-2097.152。 - 比特表示“浮点数”,其中一位比特表示符号(+或-),某些比特表示指数和其他信息,其余比特表示“尾数”。在常见的浮点数格式中,当指数和其他字段中的所有比特均为1,而尾数字段中的比特均为0时,该数字表示+∞或-∞(根据符号位)。在这种格式中,最小可表示的值为-∞。 - 例如,我们可以指定比特模式来任意表示数字。我们可以说0000000000000000000000表示34,0000000000000000000001表示-15,0000000000000000000010表示5,0000000000000000000011表示3 + 4i等等。最小可表示的值将是这些任意值中最小的那个。
因此,最小可表示的值完全取决于“类型”,因为数据的“类型”包括比特表示值的方案。
如果“类型”是“有符号整数类型”,则表示仍具有一定的灵活性。大多数现代C实现(和其他编程语言)使用上述的二进制补码方案。但是C标准仍允许另外两种方案:
  • 补码:如果第一位是1,则表示的值为负数,其大小由补充剩余的位并将它们解释为二进制得出。以六位为例,101001将是一个负数,其大小为101102=22,因此为-22。
  • 符号-大小:如果第一位是1,则表示的值为负数,其大小由将剩余的位解释为二进制得出。使用相同的位,101001将是一个负数,其大小为010012=9,因此为-9。

在补码和符号-大小中,22位可表示的最小值为-(221-1)=-2,097,151。

更进一步,C定义了标准整数类型,但允许实现扩展语言。一个实现可以定义一些带有任意方案的“有符号整数类型”来表示数字,只要该方案包括一个符号,以使名称正确。


1

不需要使用二进制补码的技术术语,我将尝试用简单的话来解释。

首先,您需要将2提高到“位数”的幂。让我们以8位类型为例:

一个无符号的8位整数可以存储2^8=256个值。由于值从0开始索引,因此值的范围从0-255。

假设您想要存储有符号的值,因此需要获得一半(只需将其除以2), 256 / 2 = 128。 请记住我们从零开始, 您可能会正确地认为您可以从两边都从零开始存储-127到127。

只需知道只有零(没有+0或-0), 因此您从零到正半部分开始。0到127, 这使您从-1到-128留下了负半边

因此,范围将是-128到127。

对于一个22位有符号整数,您可以进行以下计算:

2 ^ 22 = 4,194,304

4194304 / 2 = 2,097,152

正数一侧为-1,

范围将是-2097152到2097151。

回答你的问题,-2097152将是你可以存储的最小数字。


0

感谢大家的回复。在你们所有信息的帮助下,我弄清楚了问题所在,但是我将解释答案以显示导致我的误解的知识缺口。

数据类型在这个问题中是很重要的,因为对于有符号数据类型,第一个位用于表示二进制数是正还是负。0111 = 7,1111 = -7

有符号整数和无符号整数使用相同数量的位,32位。由于无符号整数是无符号的:第一个位不用于表示正或负,因此它可以用那个额外位来表示更大的数字。 1111 转换为无符号整数是 15,而在有符号整数中它是 -7,因为最左边的位表示符号:1 表示负数,0 表示正数。

现在回答“如果 C 中有一个有符号整数类型存储在 22 位中,它可以存储的最小值是多少?”:

如果将二进制转换为十进制,则可获得 1111111111111111111111=4194304。这个十进制值 -1 是无符号整数可以容纳的最大值。由于我们的数据类型是有符号的,因此必须使用一个少一位的位数来存储数字值,因为第一个位表示符号。这给我们 -2097152。

再次感谢大家。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接