C语言 为什么int的值域有一个-1?

guz6ccqo  于 2023-05-16  发布在  其他
关注(0)|答案(5)|浏览(729)

我读到int的范围取决于一个字节。
因此,取int为4字节长,即4 * 8位= 32位。
所以范围应该是:2 ^(32-1)= 2 ^(31)
为什么有些人说它是2^31 - 1呢?
谢谢!

cmssoen2

cmssoen21#

因为计数从0开始
int的取值范围为2,147,483,6472^32,即2,147,483,648。因此我们减去1
1位的丢失也是针对正负号
查看这个有趣的wiki文章对整数:-
正整数最常见的表示是使用二进制数字系统的位串。存储位的存储器字节的顺序变化;参见endianness。整型的宽度或精度是其表示形式中的位数。具有n位的整数类型可以编码2^n个数字;例如,无符号类型通常表示非负值0到2^(n-1)。有时使用整数值到位模式的其他编码,例如二进制编码的十进制或格雷码,或作为打印的字符代码,例如ASCII。
在二进制计算系统中有四种公知的表示有符号数的方式。最常见的是二的补码,它允许一个有符号整数类型用n位来表示从−2^(n−1)到2^(n−1)−1的数。二进制补码算法很方便,因为在表示和值之间有完美的一一对应(特别是没有单独的+0和-0),并且因为加法,减法和乘法不需要区分有符号和无符号类型。其他可能性包括偏移二进制、符号幅度和补码。

sczxawaw

sczxawaw2#

你是说232-1不是232-1
但你的问题是为什么人们使用231。如果int是有符号的,则丢失整个位。您丢失了指示数字是正数还是负数的第一位。
有符号整数(32位)的范围是-2,147,483,648到+2,147,483,647。unsigned int(32位)的范围是0到4,294,967,295(即232 - 1)。

jdzmm42g

jdzmm42g3#

int是有符号数据类型。第一位表示符号,后面是值的位。如果符号位为0,则该值仅为设置为1的所有位的总和(2的幂)。
例如,0...00101等于20 + 22 = 5
如果第一位为1,则值为-232 +所有设置为1的位的总和(2的幂)。
例如,1...111100是-232 +231 +230 +...+22 = -4
所有的0将导致零。
当你计算后,你会看到任何数字之间(包括)的范围- 231和20 +...+ 231 = 232 - 1可以用这32位创建。

dsekswqp

dsekswqp4#

232-1与232 - 1不同(因为0包含在范围内,所以我们减去1)
为了便于理解,让我们用小数字4代替32
24-1= 8,而24-1 = 16-1 = 15。
希望这有帮助!

r6vfmomb

r6vfmomb5#

因为整数是32位。它可以存储总共2^32个值。因此,一个整数的范围是从-2^31到2^31-1,总共有2^32个值(2^31个负值+2^31个正值(包括0))。但是,第一位(最高有效位)是为整数的符号保留的。同样,你需要了解负整数是如何存储的,它们是以2的补码形式存储的,所以-9将被存储为9的2的补码。因此,9在32位系统中存储为0000 0000 0000 0000 0000 0000 1001,而-9将存储为1111 1111 1111 1111 1111 0111(9的2的补码)。
同样,由于对整数的一些算术运算,如果它碰巧超过最大值(2^31-1),那么它将循环到负值。所以如果你把1加到2^31-1上,它会给予你-2^31。

相关问题