如果一个 C 有符号整数类型以 22 位存储,它可以存储的最小值是多少?
If a C signed integer type is stored in 22 bits, what is the smallest value it can store?
我正在学习数据分配,有点困惑。
如果您正在寻找可以存储在特定位数中的最小值或最大值,那么数据类型是什么重要?
22位能存的最小数或最大数不就是22个1的正数或负数吗?这个问题的第一部分是红鲱鱼吗?最小值不是-4194303吗?
一个 22 位数据元素可以存储 2^22 个不同值中的任意一个。这些值的实际含义是一个解释问题。该解释可能由编译器或某些硬件强加,或者可能在程序员的控制下,并适合某些特定应用程序。
当然,一个简单的解释就是将22位视为一个无符号整数,取值范围为0到(2^22)-1。 two's-complement,有符号整数是对相同位的稍微复杂的解释。或者您(或编译器,或 CPU)可以将 22 位分成尾数和指数,并存储一系列十进制数。范围和精度将取决于分配给尾数的位数以及分配给指数的位数。
或者您可以将这些位分开,一些用作分子,一些用作分数的分母。或者,事实上,任何其他东西。
这些位解释中的一些内置于硬件中,一些由编译器或库实现,还有一些完全在程序员的控制之下。并非所有的编程语言都允许程序员以自然或有效的方式操作单个位,但有些语言可以。有时,使用非常规的二进制数据解释可以显着提高效率,但通常以牺牲可读性和可维护性为代价。
所以,是的,数据类型很重要。
没有(人类、逻辑或自然的)法则规定位只能以一种模式表示数字,其中一个位代表 20,另一个代表 2 1,另一个表示 22,依此类推(表示的数字是那些为 1 的位的值的总和)。我们可以选择如何使用位来表示数字,包括:
- 位确实使用该模式,因此 22 位可以表示从 0 到 20 + 21[=50= 之和的任何数字] + 22 + … + 221 = 222 − 1 = 4,194,303。可表示的最小值为 0。
- 位主要使用该模式,但对其进行了修改,以便一位表示 −221 而不是 +221。这称为two's complement,可表示的最小值是−221 = −2,097,152.
- 除了表示值除以1000之外,这些位表示的数字如上所述。这称为fixed-point。在第一种情况下,所有位 1 表示的值将是 4194.303,但最小的可表示值将是 0。结合二进制补码和按 1/1000 缩放的 fixed-point,最小的可表示值将是 - 2097.152.
- 位表示一个floating-point数,其中一位表示符号(+或-),某些位表示指数等信息,其余位位代表 significand。在常见的floating-point格式中,当exponent-and-other字段中的所有位均为1且有效位字段位为0时,该数字根据符号位表示+∞或-∞。在这样的格式中,最小的可表示值是-∞。
- 例如,我们可以指定位模式来任意表示数字。我们可以说 0000000000000000000000 代表 34,00000000000000000000001 代表 −15,0000000000000000000010 代表 5,00000000000000000000011 代表 3+4i,等等。最小的可表示值将是那些任意值中最小的那个。
那么最小的可表示值是什么完全取决于类型,因为数据的“类型”包括位表示值的方案。
如果类型是“有符号整数类型”,在表示上还是有一些灵活性的。大多数现代 C 实现(和其他编程语言)都使用上述二进制补码方案。但是C标准仍然允许另外两种方案:
- 一个补码:如果第一个位为1,则表示的值为负数,其大小由其余位补码给出,解释为二进制。以 6 位为例,101001 将是负数,大小为 101102 = 22,因此 −22.
- Sign-and-magnitude:如果第一个位为1,表示的值是负数,其大小由将其余位解释为二进制给出。使用相同的位,101001 将负数 010012 = 9,所以 −9.
在补码和sign-and-magnitude中,22位的最小可表示值是-(221-1)=-2,097,151。
为了进一步扩展问题,C 定义了标准整数类型,但允许实现扩展语言。一个实现可以使用任意方案来定义一些“有符号整数类型”来表示数字,只要该方案包含一个符号,就可以使名称正确。
我将尽量用通俗易懂的语言进行解释。
首先你需要用 'number of bits' 的幂加注 2。
我们以8位类型为例,
一个un-signed 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 将是您可以存储的最小数字。
感谢大家的回复。我在您提供的所有信息的帮助下弄明白了,但我会解释答案,以准确说明我的知识差距导致了我的误解。
数据类型在这个问题中很重要,因为对于有符号数据类型,第一位用于表示二进制数是正数还是负数。 0111 = 7 和 1111 = -7
sign int和unsigned int使用相同的位数,都是32位。由于 unsigned int 是无符号的:第一位不用于表示正数或负数,因此它可以用该额外位表示更大的数字。 1111 转换为 unsigned int 是 15,而 signed int 是 -7,因为最左边的位代表符号:1 是负数,0 是正数。
现在回答“如果一个 C 有符号整数类型以 22 位存储,它可以存储的最小值是多少?”:
如果您将二进制转换为十进制,您将得到 1111111111111111111111 = 4194304
这个十进制值 -1 是无符号数可以容纳的最大值。由于我们的数据类型是有符号的,因此它必须少使用一位作为数字值,因为第一位代表符号。这给了我们 -2097152.
再次感谢大家
我正在学习数据分配,有点困惑。
如果您正在寻找可以存储在特定位数中的最小值或最大值,那么数据类型是什么重要?
22位能存的最小数或最大数不就是22个1的正数或负数吗?这个问题的第一部分是红鲱鱼吗?最小值不是-4194303吗?
一个 22 位数据元素可以存储 2^22 个不同值中的任意一个。这些值的实际含义是一个解释问题。该解释可能由编译器或某些硬件强加,或者可能在程序员的控制下,并适合某些特定应用程序。
当然,一个简单的解释就是将22位视为一个无符号整数,取值范围为0到(2^22)-1。 two's-complement,有符号整数是对相同位的稍微复杂的解释。或者您(或编译器,或 CPU)可以将 22 位分成尾数和指数,并存储一系列十进制数。范围和精度将取决于分配给尾数的位数以及分配给指数的位数。
或者您可以将这些位分开,一些用作分子,一些用作分数的分母。或者,事实上,任何其他东西。
这些位解释中的一些内置于硬件中,一些由编译器或库实现,还有一些完全在程序员的控制之下。并非所有的编程语言都允许程序员以自然或有效的方式操作单个位,但有些语言可以。有时,使用非常规的二进制数据解释可以显着提高效率,但通常以牺牲可读性和可维护性为代价。
所以,是的,数据类型很重要。
没有(人类、逻辑或自然的)法则规定位只能以一种模式表示数字,其中一个位代表 20,另一个代表 2 1,另一个表示 22,依此类推(表示的数字是那些为 1 的位的值的总和)。我们可以选择如何使用位来表示数字,包括:
- 位确实使用该模式,因此 22 位可以表示从 0 到 20 + 21[=50= 之和的任何数字] + 22 + … + 221 = 222 − 1 = 4,194,303。可表示的最小值为 0。
- 位主要使用该模式,但对其进行了修改,以便一位表示 −221 而不是 +221。这称为two's complement,可表示的最小值是−221 = −2,097,152.
- 除了表示值除以1000之外,这些位表示的数字如上所述。这称为fixed-point。在第一种情况下,所有位 1 表示的值将是 4194.303,但最小的可表示值将是 0。结合二进制补码和按 1/1000 缩放的 fixed-point,最小的可表示值将是 - 2097.152.
- 位表示一个floating-point数,其中一位表示符号(+或-),某些位表示指数等信息,其余位位代表 significand。在常见的floating-point格式中,当exponent-and-other字段中的所有位均为1且有效位字段位为0时,该数字根据符号位表示+∞或-∞。在这样的格式中,最小的可表示值是-∞。
- 例如,我们可以指定位模式来任意表示数字。我们可以说 0000000000000000000000 代表 34,00000000000000000000001 代表 −15,0000000000000000000010 代表 5,00000000000000000000011 代表 3+4i,等等。最小的可表示值将是那些任意值中最小的那个。
那么最小的可表示值是什么完全取决于类型,因为数据的“类型”包括位表示值的方案。
如果类型是“有符号整数类型”,在表示上还是有一些灵活性的。大多数现代 C 实现(和其他编程语言)都使用上述二进制补码方案。但是C标准仍然允许另外两种方案:
- 一个补码:如果第一个位为1,则表示的值为负数,其大小由其余位补码给出,解释为二进制。以 6 位为例,101001 将是负数,大小为 101102 = 22,因此 −22.
- Sign-and-magnitude:如果第一个位为1,表示的值是负数,其大小由将其余位解释为二进制给出。使用相同的位,101001 将负数 010012 = 9,所以 −9.
在补码和sign-and-magnitude中,22位的最小可表示值是-(221-1)=-2,097,151。
为了进一步扩展问题,C 定义了标准整数类型,但允许实现扩展语言。一个实现可以使用任意方案来定义一些“有符号整数类型”来表示数字,只要该方案包含一个符号,就可以使名称正确。
我将尽量用通俗易懂的语言进行解释。
首先你需要用 'number of bits' 的幂加注 2。 我们以8位类型为例,
一个un-signed 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 将是您可以存储的最小数字。
感谢大家的回复。我在您提供的所有信息的帮助下弄明白了,但我会解释答案,以准确说明我的知识差距导致了我的误解。
数据类型在这个问题中很重要,因为对于有符号数据类型,第一位用于表示二进制数是正数还是负数。 0111 = 7 和 1111 = -7
sign int和unsigned int使用相同的位数,都是32位。由于 unsigned int 是无符号的:第一位不用于表示正数或负数,因此它可以用该额外位表示更大的数字。 1111 转换为 unsigned int 是 15,而 signed int 是 -7,因为最左边的位代表符号:1 是负数,0 是正数。
现在回答“如果一个 C 有符号整数类型以 22 位存储,它可以存储的最小值是多少?”:
如果您将二进制转换为十进制,您将得到 1111111111111111111111 = 4194304 这个十进制值 -1 是无符号数可以容纳的最大值。由于我们的数据类型是有符号的,因此它必须少使用一位作为数字值,因为第一位代表符号。这给了我们 -2097152.
再次感谢大家