int 类型取值范围的困惑

int类型在 内存占16位, 取值范围是(-2的15次方) ~~(2的15次方-1)
我想问的是 取值范围为什么不是(-2的15次方+1) ~~(2的15次方-1)?
最小值(-2的15次方)是怎么来的?请用补码形式讲解
1楼的 用这种角度考虑~你的回答我同意。
2楼的 最大的正数就是01111111 11111111
但这不能说明最小的负数就是10000000 00000000
还有10000000 00000000=-(01111111 11111111 +1)=-2^15 我没看懂
但也请你们看下我的想法。
负数的补码 是其的绝对值取反加一,符号位变成1。
那(-2的15次方)的补码是 |-2^15 |取反加一,符号位变1。
但正整数最大值是 2^15 -1,|-2^15 |大于2^15 -1。
所以|-2^15 |的源码怎么来的,二进制是多少。

在内存中,正数的原码和补码是一样的,而负数的补码为其绝对值的原码按位取反后加1.

对于补码是0000000000000000时,对应的值为0

补码范围是0000000000000001-0111111111111111,对应的值为全部正整数,即1-2^15-1.

补码范围是1000000000000001-1111111111111111,对应的原码是100000000000001-111111111111111,值的范围是-1~-(2^15-1)。

还有一个数是100000000000000,它不能使用补码计算公式进行计算的。是计算机内部直接用它来表示-2^15。你可以参考一下:http://blog.csdn.net/aiirr/archive/2007/12/28/1998545.aspx

参考资料:http://blog.csdn.net/aiirr/archive/2007/12/28/1998545.aspx

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-01-18
16位太长,我现在以8位举例:-1的原码是00000001,它(负数)在内存中是以补码(补码=原码取反+1)表示的,为:11111111。其中最高一位是符号位,我们讲0为正,1为负,是因为补码的最高位必然为1(原因就不用解释了吧) 。-128的原码是10000000,补码还是10000000,最高位还是符号位1,所以8位的补码能够表达-128到时-1,8位的原码(正数)能够表达0到127(01111111),以此推到16位,能理解不?
第2个回答  2011-01-18
16位内存一共可以表示(2的16次方)种数,其中(2的15次方-1)种是正数,0非正非负,因此还剩(2的16次方 - [2的15次方-1] - 1)=(2的15次方)种为负数,因此可以表示的最小值为-(2的15次方),即(-2的15次方)
第3个回答  2011-01-18
你可以试一下能否表示出来2^15+1来,事实上是不能的,分析如下
最高位是符号位:0为正,1为负
所以最大的正数就是01111111 11111111=2^0 + …… + 2^14 = (1-2^15)/(1-2)=2^15 -1
最大的负数就是10000000 00000000=-(01111111 11111111 +1)=-2^15

int 类型取值范围的困惑
补码范围是0000000000000001-0111111111111111,对应的值为全部正整数,即1-2^15-1.补码范围是1000000000000001-1111111111111111,对应的原码是100000000000001-111111111111111,值的范围是-1~-(2^15-1)。还有一个数是100000000000000,它不能使用补码计算公式进行计算的。是计算机内部直接用它来表示-2^15。你...

数据库int类型取值范围
数据库int类型取值范围1. 什么是整型数据类型整型数据类型是一种计算机编程语言中的基本数据类型。它能够表示整数,通常包括正整数,负整数和零。在不同的编程语言中,整型数据类型的名称和大小可能不同。例如,在C语言中,整型数据类型的大小是4个字节,它的范围是从-2147483648到2147483647;而在Java语言...

int **p指针使用困惑
对于int **p来说,p所指的对象是指针,那么++p就是让p的值增一个指针的大小,虽然指针所指对像可大可小,但是指针自己的大小却是一定的,目前的系统上一般是4字节(64位系统我没用过,可能是8字节)。也就是说,对char *p和long *q来说,p和q本身占内存容量是一样大的(虽然char和long占内存...

有关C语言中左移<<操作的困惑
所以0x12300是2个半字节,当然并不是这个值的大小, 他只是显示的时候把前面的0省略了

C语言求值问题——再次困惑
这道题有一些问题,我在VC6.0环境下运行,结果用十六进制输出是0xCCCC010A,说明题中只是将低位的两个字节赋值了,而高位的两个字节的值是不确定的.在对x.c[0],x.c[1]赋值之前先对整块内存初始化一下就OK了,程序改为:void main(){ union ss { int i;char c[2];};union ss x;x.i = ...

int型跟char型怎么转换的?
理解int与char类型之间的转换,需要从其取值范围与存储方式出发。int类型使用4个字节存储,取值范围从-2147483648到2147483647,而char类型占用1个字节,其取值范围限制在-128到127。在赋值过程中,若值在两者可接受范围内,则能正常转换。然而,一旦超出范围,会进入循环模式,将数值视为在一个大环中的位置...

编程时有两种写法很让人困惑,见问题补充:
你好,这两种可以说是基本一样,只不过有些赋初值了,有些没赋初值,看你想怎么用了,第一种只是声明i,j,k,count是整型变量,同时给count赋初值为0;你的第一种可以这么写就跟下面的一样了,int i=0,j=0,k=0,count=0;第二种是声明整形变量的同时赋初值,谢谢,望采纳,...

一文搞懂MySQL的数据类型中长度的含义
例如,定义 DECIMAL(5,2) 则表示最大位数为5位,小数点后2位,因此小数点前还剩下3位,于是取值范围为 -999.99至999.99 。DECIMAL类型的存储方式与其他数字类型都完全不同,它是以字符串形式进行存储的。存储时有补0操作。例如,如果准备存入9.5,小数点前应为3位,缺2位,小数点后应为2位,...

对C语言中整除运算符的困惑!
也就是说,如果除数和被除数都是int型,那么结果也是int型,所以7\/3的结果是2,如果除数和被除数中有一个是float型,那么结果就是float型,所以不需要取整,2.0\/(2*5.0) = 2.0\/10.0 = 0.2。这个程序你可以试试把float改成int,那么结果应该是 2\/(2*5) = 2\/10 = 0 ...

error: '::main' must return 'int'解决办法
面临运行时的错误提示,显示"::main'必须返回'int'",你可能会感到困惑。不过,通过理解问题的根源和进行相应的代码调整,这个困扰便能迎刃而解。深入分析,发现错误的根源在于C++标准中明确要求main函数需要返回一个'int'类型。而你可能在使用C语言时,将其写为void类型,这是造成问题的原因之一。再者...

相似回答