c语言有符号int取值范围
展开全部
结论,取值范围是-2^31~2^31-1(十六进制为0x80000000~0x7fffffff)。因为0既不是正数也不是负数,+0是0,-0是最小的负数(-最大正数-1),所以负数的取值范围比正数多一个数。
int为四个字节,一共32位,其中最高位为符号位,0表示正数,1表示负数,剩下的31位表示数。所以一共可表示2*2^31即2^32个数字(包括一个0)。
在计算机中保存有符号数,保存的是数的二进制的补码,正数的源码、反码、补码相同,负数的反码为源码除符号位之外其余位取反,补码为反码+1(符号位不参与这个运算)。
在计算机中,正数为常量,且源码和补码相同,所以存储正数直接存就行。而负数因为有一个负号-,所以负数是一个计算表达式,都是由负数的绝对值计算出该负数的补码后存储在计算机中的。
求负数的补码值的时候,如-5,首先确定其符号位是1,后面写出其绝对值的二进制形式,28个0后面跟101,反码为29个1后面跟010,再加1就是补码29个1后面跟011,那么-5在计算机中就是存为29个1后面跟011。
所以可知0是32个0,最大正整数为0后面31个1,即2^31-1(2^31个数里包含了0,所以正数的个数要减去一个)。按理说正负数应该是对称的,最小的负数应该是-最大正整数,即-(2^31-1),为什么实际上最小的负数为 -最大正整数-1?为什么-0是最小的负数?
注意,虽然 -最大正整数-1 就是 -(2^31-1)-1 = -2^31,但是写的时候不能写 int i = -2^31;因为说了负数其实是一个计算表达式,实际上是先对正数取反然后加1,符号位置为1,但是正数最大值是2^31-1,所以写-2^31是溢出的,这涉及到另外一个知识点。
先解释为什么-0是最小的负数(负的最大正整数-1)。
负的最大正整数的源码:32个1。反码:1后面跟31个0。补码:左右各1个1,中间30个0。所以,负的最大正整数(-(2^31-1))在计算机中存储为:1三十个零1。负的最大正整数-1就是负的最大正整数加-1。-1的补码为:32个1(十六进制为0xffffffff),那么两个补码相加:1三十个零1 + 32个1 = 1三十一个零。所以 负的最大正整数减一 的补码为:1三十一个零(十六进制为0x80000000),那么可以推断出其反码是32个1,则源码是1三十一个零,即-0,所以-0就是 负的最大正整数减一 ,-0的源码和补码相同。
那么为什么最小的负数是 负的最大正整数-1,为什么不能是负的最大正整数-2,或者减3......,因为通过计算,负的最大正整数的补码+负二的补码=0后面跟三十一个1,变成了最大的正整数。显然是不对的,同一个补码只能表达一种含义,减3同理,所以就规定最小的负数为负的最大正整数-1。
int为四个字节,一共32位,其中最高位为符号位,0表示正数,1表示负数,剩下的31位表示数。所以一共可表示2*2^31即2^32个数字(包括一个0)。
在计算机中保存有符号数,保存的是数的二进制的补码,正数的源码、反码、补码相同,负数的反码为源码除符号位之外其余位取反,补码为反码+1(符号位不参与这个运算)。
在计算机中,正数为常量,且源码和补码相同,所以存储正数直接存就行。而负数因为有一个负号-,所以负数是一个计算表达式,都是由负数的绝对值计算出该负数的补码后存储在计算机中的。
求负数的补码值的时候,如-5,首先确定其符号位是1,后面写出其绝对值的二进制形式,28个0后面跟101,反码为29个1后面跟010,再加1就是补码29个1后面跟011,那么-5在计算机中就是存为29个1后面跟011。
所以可知0是32个0,最大正整数为0后面31个1,即2^31-1(2^31个数里包含了0,所以正数的个数要减去一个)。按理说正负数应该是对称的,最小的负数应该是-最大正整数,即-(2^31-1),为什么实际上最小的负数为 -最大正整数-1?为什么-0是最小的负数?
注意,虽然 -最大正整数-1 就是 -(2^31-1)-1 = -2^31,但是写的时候不能写 int i = -2^31;因为说了负数其实是一个计算表达式,实际上是先对正数取反然后加1,符号位置为1,但是正数最大值是2^31-1,所以写-2^31是溢出的,这涉及到另外一个知识点。
先解释为什么-0是最小的负数(负的最大正整数-1)。
负的最大正整数的源码:32个1。反码:1后面跟31个0。补码:左右各1个1,中间30个0。所以,负的最大正整数(-(2^31-1))在计算机中存储为:1三十个零1。负的最大正整数-1就是负的最大正整数加-1。-1的补码为:32个1(十六进制为0xffffffff),那么两个补码相加:1三十个零1 + 32个1 = 1三十一个零。所以 负的最大正整数减一 的补码为:1三十一个零(十六进制为0x80000000),那么可以推断出其反码是32个1,则源码是1三十一个零,即-0,所以-0就是 负的最大正整数减一 ,-0的源码和补码相同。
那么为什么最小的负数是 负的最大正整数-1,为什么不能是负的最大正整数-2,或者减3......,因为通过计算,负的最大正整数的补码+负二的补码=0后面跟三十一个1,变成了最大的正整数。显然是不对的,同一个补码只能表达一种含义,减3同理,所以就规定最小的负数为负的最大正整数-1。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询