您的位置:

c语言为什么负数的范围比整数广,c语言为什么输出的数是很大的负数

本文目录一览:

C/C++中数据类型为什么会有正数和负数范围

C/C++中所有的整数都用二进制补码表示。

char型的正数范围是1~127而不是0~255;unsigned char型的范围才是0~255。

char型的范围是-128~+127。

因为整数域客观上存在负数、0和正数,所以C/C++的整数数据类型必须“适应”这种客观需要;unsigned数据只是在实际问题不涉及负数时定义的所谓“无符号数”,用以扩展有限的二进制位长表达更多的整数。

c语言整形数值取值范围为什么有负数

整数 分为正整数 负整数 0

如果用最高为做符号位的话 c语言里就会出现负数

使用sizeof(类型) 来确定范围

sizeof(int) 如果等于4的话 那么表示4*8=32 bits 2^32=4294967296

int 范围就是-2147483647~2147483648

sizeof(int) 如果等于2的话 那么表示2*8=16 bits 2^32=65536

int 范围就是-32768~32768

同样的类型在不同编译器里大小不同~~

c语言中整型数据为什么能表示的最大负数大于正数

c语言中负数表示方法就是在数前加负号“-”,比如:

-5,-10000,等

一个变量赋值为负数也是如此,比如:

x=-1000;

有符号整型的数据范围为什么负数比正数多一个

在JAVA中,有符号整型(long,int,short,byte)类型能表示的数据范围总是负数个数比正数要多一个,为什么?

以最简单(位数最短)的byte举例

按照通常直觉,正负数不是对称的么,为什么负数最小不是-127,又或正数最大是128呢?

byte类型是8bit表示,那么可以表达的状态就有2^8=256个,如果表示无符号整数可以表达最小2进制00000000到最大2进制11111111(=255)共256个数字。

但是JAVA中整型都是有符号,区分就看第一个bit位,第一个bit如果是0则是正数,如果为1则是负数。看到这里就有疑问了,如果第一个bit位表示符号,那么剩下的7位能表示的范围只能是0到2^7-1=127了,岂不是全部数据范围就是-127~127(包括0)共255个数字,先前我们说了,8bit可以表达256个状态,怎么少了一个呢?

原来正0(00000000)和负0(100000000)都是0,计算意义上看也就是重复表达同样的意义,浪费了一个状态表示。为了不浪费资源,尽可能多的存储数据范围,先贤发明了补码表示负数,即一个负数可以用对应的正数的补码表示,而补码=(正数)原码取反(=反码)+1

现在我们用定义一个byte变量值是-127,内存如何存储呢?即求补码

1.127的2进制原码=01111111,

2.求反码=源码取反=10000000

3.反码加1后变成10000001,这就是-127的2进制表示

OK,现在反过来看,计算机指令看到一个byte类型变量值是10000001,怎么得到-127呢?

就是上面求补码的逆向过程,

1.发现第一bit位是1,知道这是补码,是负数

2.补码减1 得出反码=10000000

3.反码取反得到原码=01111111,这就是正数127的2进制表示

4.因此10000001的值就是-127

接下来继续解释:

为什么取值范围负数总是比正数大一呢,不应该是一样的么,比如说16位是-32768--32767.

这里有一个0值的差别。

以最简单的单字节char型为例。占8位,最高位为符号位。

这样0值就有了

0000 0000 (正零)

1000 0000 (负零)

两种。

从数学角度上,是没区别的,可是用两种形式表示一个数,明显是浪费了。于是计算机存储就约定,当符号位为0,即正零时才是0.符号位为1时,让它去表示另外一个数好了。

那这个数是什么呢,按照补码的方式求一下,

1000 0000首先符号位为1,是个负数,

取反,0111 1111

加一,1000 0000

又回来了... 但这时代表的就是值了,注意这里的1已经不是符号位了。计算其值就是128.

于是 1000 0000就表示成了-128。