我正在学习数据分配,但有些困惑。
如果你正在寻找可以存储在特定位数的最小或最大值,那么数据类型是否重要?
无论是什么数据类型,能够在22个位中存储的最小或最大数字不都应该是22个1的正负数吗?这个问题的第一部分是否是一个干扰项?最小值难道不应该是-4194303吗?
在补码和符号-大小中,22位可表示的最小值为-(221-1)=-2,097,151。
更进一步,C定义了标准整数类型,但允许实现扩展语言。一个实现可以定义一些带有任意方案的“有符号整数类型”来表示数字,只要该方案包括一个符号,以使名称正确。
不需要使用二进制补码的技术术语,我将尝试用简单的话来解释。
首先,您需要将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将是你可以存储的最小数字。
感谢大家的回复。在你们所有信息的帮助下,我弄清楚了问题所在,但是我将解释答案以显示导致我的误解的知识缺口。
数据类型在这个问题中是很重要的,因为对于有符号数据类型,第一个位用于表示二进制数是正还是负。0111 = 7,1111 = -7
有符号整数和无符号整数使用相同数量的位,32位。由于无符号整数是无符号的:第一个位不用于表示正或负,因此它可以用那个额外位来表示更大的数字。 1111 转换为无符号整数是 15,而在有符号整数中它是 -7,因为最左边的位表示符号:1 表示负数,0 表示正数。
现在回答“如果 C 中有一个有符号整数类型存储在 22 位中,它可以存储的最小值是多少?”:
如果将二进制转换为十进制,则可获得 1111111111111111111111=4194304。这个十进制值 -1 是无符号整数可以容纳的最大值。由于我们的数据类型是有符号的,因此必须使用一个少一位的位数来存储数字值,因为第一个位表示符号。这给我们 -2097152。
再次感谢大家。
float
,如果它有22位容量,它可以表示的最小数字是多少? - wallykINT_MIN
和FLT_MIN
使用不同的概念来表示“最小值”。 - Weather Vane