C语言数据类型问题

C语言中无符号int函数取值范围是-2147483648~2147483647,为什么正负在数轴上不对称,为什么正数部分不是2147183648?求详细解答【高悬赏!】

首先纠正一下,这不是无符号int,是有符号,符号位就是用来表示正负数的。
取值范围的总数肯定是个偶数,这个好理解吧?那么在这个数量范围内,正数的个数和负数的个数肯定不可能相同啦,否则它们的和就是偶数,那么你把0这个数往哪放?
你也可以这样想:把偶数个数放到数轴上,处在最中间的肯定是两个数,不管以哪个数作为原点,数轴两边的数肯定都不可能对称啦!
如果以16进制来表示,正数是从1到0x7FFFFFFF(即1到2147483647),数量为2147483647个,负数是从0x80000000到0xFFFFFFFF(即-2147483648到-1),数量为2147483648个,再加上一个0,总数就是4294967296(也就是2的32次方)
顺便说说:你所谓的无符号int的取值范围是0到4294967295,总数不也是4294967296吗?
最后总结一下:问题的焦点就在于0既不是正数,也不是负数,所以在数轴上正数和负数的数量肯定不会是对等的,当然在实际应用中(或者说在传统习惯上),通常是把0归类到正数(比如说在大多数程序设计语言中都是把0作为序号的起始数),这样的话,在一个指定的整数范围内,负数就比正数多一个了。追问

如果仅凭主观臆想而不是依据计算机原理的话,我岂不是可以说取值范围是-2147483647~2147483648?【一脸不解】,求大神指教!!

追答

那就是说负数比正数少一个咯,那么在数轴上不同样是不对称吗?
另外,如果2147483648是最大的32位正整数,那么它的二进制表示形式就是

1000 0000 0000 0000 0000 0000 0000 0000
也就是说它的最高位(符号位)是1,如果它是正数,那你让电脑如何识别其他负数?
所以,最大的32位正整数只能是下面这个:
0111 1111 1111 1111 1111 1111 1111 1111
也就是16进制的 0x7FFFFFFF、10进制的2147483647

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-10-18
首位是符号位,0是正数,1就是负数,那么这样问题就来了,比方8位,00000000是0,那10000000不也是0嘛,只不过代表-0,这样两个二进制表示一个数不就浪费了。其实-0的那个我们按补码处理一下,首先首位是1肯定是负数,还原回原码也是10000000,所以他代表的值就是-2^7,这就是不对称的那一个,但是一共能表示的数的范围肯定是偶数的;32位64位就同理了追问

为什么能表示的数一定是偶数?

追答

每一个位置都是0,1两种可能,那一共的可能数不就是2^n嘛;首位当做符号位顶多少了一位,总数还是偶数。

第2个回答  2018-10-18
int型占32位字节,最大存储数为2147483648 * 2,如果分正负则正负各2147483648。
但是在计算机内部,正数的二进制首位是0,负数首位是1。0的二进制表示首位就是0,因此把0也归为正数一类。所以正数最大值的绝对值就比负数最小数的绝对值小1。
第3个回答  2018-10-18
大多数机器上一个整数用4byte也就是32bit表示,总共可以表示2^32==4294967296个,无符号整数的范围是[0,4294967295];对于有符号的整数,其实总数也是4294967296个2147483647 个正数
1 个0
2147483648个负数
明白了吗.
第4个回答  2018-10-18

short短整型也是%d,long int长整型是%ld,单精度float是%f,双精度double是%lf,字符char是%c,char字符数组是%s,指针类型是%p等。下面上手机上用易历知食软件里的微C程序设计来编写个示例,手机上代码如下图:

手机上运行效果如下图:

相似回答