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

2021-03-07 14:37:33 字数 5269 阅读 6286

1楼:

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

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

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

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

2楼:秋叶丝语

每种类型都分为: 有符号和无符号两种

比如你所说的char类型,也分为:unsigned char 和signed char

char在大多数的编译器中是认为是signed char。

unsigned char的取之范围是:0-255 (8为都是数据)signed char的取之范围是:-128 - 127 (最高位是符号位,剩下7位是数据)。

无论是有符号数还是无符号数在内存中都是以补吗的方式存储的。

3楼:匿名用户

知道这个范围就行,实际中用不用,要看实际的情况~~~

c/c++中char型数据为什么unsigned char也可以取负值,而char类型取值-157也可以??

4楼:

你的“感觉copy”不错。对char型而言,赋一个bai

略大于127和小于0的数都du是负数zhi,如dao

果小于-128就反而成正数了,比如char a=-157;printf("%d\n",a);输出是99。实际上是这样的:无论数据有多大多小,总是把这个数的二进制最低字节赋给char变量,那么这个最低字节的最高位就决定了这个数的正负!

仍以上例,-157的二进制补码是101100011,最低8位是01100011,它的最高位是0,就被解释为正数99了。但这不应该认为是正常显示,本是一个负数都显示为正数了怎么还算正常?不仅是char变量,int也一样,超出能表示的范围后就如以上那样“乱套”了。

所以编程时要注意控制数据类型的范围,不然就得不出正确的结果。

c语言基本整型的数据范围什么意思

5楼:匿名用户

基本整型变量,所占字节数为2,每个字节等于八位二进制数,可以用0和1表示的八位二进制数,2个字节也就是16位二进制。

最高位表示正负,所以用0和1组成的16位数字范围为-2的15次方~2的15次方,也就是-32768~32767。因此基本整型变量数据范围是-32768~32767。

6楼:匿名用户

int占4个字节,一个字节4位,则它的空间有2的16次方byte,若有unsigned修饰,则说明它是无符号整型数据,它的范围为0~65535,若没有unsigned修饰,则说明最高位为符号位,它的范围为-32768~32767

对于无符号数,比较简单,根据占用的位数可以直接计算:

unsigned short 16位 0~2的16次方-1(即65535)

unsigned int 16位 0~2的16次方-1(即65535)

unsigned long 32位 0~2的32次方-1(即4294967295)

对于有符号数,由于符号位占用一位,并且负数要用补码表示。

以8位数据为例:2进制的11111111表示-1,10000000表示-128,所以负数范围-128~-1;2进制00000000表示0,01111111表示127,所以正数范围0~127。合起来就是-128~127,找一下规律发现是- 2的(8-1)次方~2的(8-1)次方-1,那么就可以得到任何位数的范围:

short 16位 - 2的(16-1)次方~2的(16-1)次方-1(即-32768~32767)

int 16位 - 2的(16-1)次方~2的(16-1)次方-1(即-32768~32767)

long 32位 - 2的(32-1)次方~2的(32-1)次方-1(即-2147483648~2147483648)

扩展资料:

(1)char:字符型数据,属于整型数据的一种,占用一个字节

(2)unsigned char:无符号字符型数据,属于整型数据的一种,占用一个字节

(3)short:短整型数据,属于整型数据的一种,占用两个字节

(4)unsigned short:无符号短整型数据,属于整形数据的一种,占用两个字节

(5)int:整形数据,属于整型数据的一种,占用四个字节

(6)unsigned int:无符号整型数据,属于整型数据的一种,占用四个字节

(7)long:长整型数据,属于整型数据的一种,占用四个字节

(8)unsigned long:无符号长整型数据,属于整形数据的一种,占用四个字节

实 型 变 量 的 类 型 有 float和 double两 种 ,下 表 列 出 这 两 种 类型所 占 内 存 的 位数 和 其 表 示 范 围 。数据类型 所占位数 数的范围:

float 32 3.4e-038~3.4e+038

double 64 1.7e-308~1.7e+308

双 精 度 类 型 double比 单 精 度 类 型 float具 有 更 高 的 精 度 和更大 的 表 示 范 围 ,常 常 使 用 。

7楼:蔷祀

整型变量int占4个字节,一个字节4位,则它的空间有2的16次方byte,若有unsigned修饰,则说明它是无符号整型数据,它的范围为0~65535。若没有unsigned修饰,则说明最高位为符号位,它的范围为-32768~32767。

int是数据库中一种数据类型,同时,作为函数,int函数指数据库中常用函数中的“向下取整函数”。常用来取一个数中的整数部分。int是将一个数值向下取整为最接近的整数的函数。

为取整函数。

扩展资料

c语言中其他数据的取值范围:

①短整型:

类型说明符为short int或short'c110f1。所占字节和取值范围会因不同的编译系统而有差异。对于16字机,short int 占2个字节,在大多数的32位机中,short int 占4个字节。

但总的来说,short int 至少16位,也就是2个字节。

②长整型:

类型说明符为long int或long ,在内存中占4个字节,其取值为长整常数。在任何的编译系统中,长整型都是占4个字节。在一般情况下,其所占的字节数和取值范围与基本型相同。

③无符号型:

类型说明符为unsigned。在编译系统中,系统会区分有符号数和无符号数,区分的根据是如何解释字节中的最高位,如果最高位被解释为数据位,则整型数据则表示为无符号数。

8楼:匿名用户

1 字节 = 8位

int型 2字节 = 16位

按vc++和c++的规定,int和long等长,都是32位的。short才是16位的。只有原始的c才定义int和short等长为16位。

这个数据范围指的确实是具体 int的取值范围,但不是你理解的那样。

现在以16位的short为例。

首先必须清楚一个概念,计算机中存放的数据都是以二进制形式存放的。short存放的是整型数据,是用固定位数16个二进制位来表示一个整数,不足16位补0。

比如125的二进制是1111101,那么在内存中存放就是

0000 0000 0111 1101

那么16个二进制位能够表示多少种不同的整数呢?稍微用点数学常识就知道,是2的16次方,也就是65536个不同的整数。所以对于无符号整数,unsigned short的范围就是0~65535。

而为了表示负数,计算机用short的第一位作为符号位来表示正负。注意,计算机中是以补码的形式存放整数的。对于正数,补码是其本身;对于负数,其补码是对其绝对值的按位取反,再加1的结果。

举个简单的例子:

125是0000 0000 0111 1101

-125计算过程:

125是0000 0000 0111 1101

按位取反,1111 1111 1000 0010

再加1,1111 1111 1000 0011

所以-125就是1111 1111 1000 0011。

补码不是三言两语能讲得清楚的,楼主有个概念即可。

我们发现,正数的补码首位都是0,负数的补码首位都是1。

short有符号型的范围是-32768~32767。

那么,如果超出了范围,会发生什么现象呢?

很简单,这称为溢出。

比如short a = 32768

32768是1000 0000 0000 0000。还记得我讲过吗?正数的补码首位都是0,但这里首位为1,这是怎么回事呢?

其实因为浪费了1位做符号位,short的有效位数只是15位而已,而2的15次方是32768,因此正数的范围是0~32767,32768超出了范围,计算机怎么处理呢?结果就是把它当作负数,根据补码计算它的原码。反过来即可

1000 0000 0000 0000 减1,

0111 1111 1111 1111 再按位取反,

1000 0000 0000 0000 就是32768

所以1000 0000 0000 0000表示-32768

也就是说short a = 32768;把a输出来得到-32768楼主可以试验一下。

再举一例:

unsigned short a=65536;

65536是1 0000 0000 0000 0000 注意这已经是17位了。计算机会自动截取后面的16位

就是得到0000 0000 0000 0000,也就是0

所以unsigned short a=65536;输出a得到0。

明白了吗?

9楼:听不清啊

对于无符号数,根据占用的位数可以直接计算:

unsigned short 16位 0~2的16次方-1(即65535)

unsigned int 16位 0~2的16次方-1(即65535)

unsigned long 32位 0~2的32次方-1(即4294967295)

对于有符号数,由于0也占用一个位置,导致负数的边界值与正数的边界值不一样:

short 16位 - 2的(16-1)次方~2的(16-1)次方-1(即-32768~32767)

int 16位 - 2的(16-1)次方~2的(16-1)次方-1(即-32768~32767)

long 32位 - 2的(32-1)次方~2的(32-1)次方-1(即-2147483648~2147483647)

水泥地面怎么干,可以即省力又快还干净

1楼 月夜下丶温情 不建议用扫的,因为成效不大,去请一辆那种清理马路灰尘垃圾的车吧,如果找不到那只有用管子啦 2楼 感性的小安安 水泥地只有水冲最干净,没错,可以多让几个人帮忙清洁一下 3楼 匿名用户 镜子反射太阳光,外加电风扇 4楼 匿名用户 你要是有心的话,拿个风筒在哪儿吹 怎么样墩地又快又干净...

C++中函数的数据类型表达了什么意思

1楼 匿名用户 void是错误的,我可以明确告诉你,别学那样写。正确 的形式是int。我记得以前看一本书上这样说过。 其他的函数返回值就是你自己把握了,你想让其返回什么就是什么了。不想让此函数返回值就void了 2楼 吾守护奇迹 你所写的main函数实际上并不是真正的程序入口点函数 它会由c 运行时...

c++中double类型的0乘以负数输出为-0,为什么?详情

1楼 匿名用户 好吧,这道题太让我好奇了,一看没人回答,我自己试了一下。 一样的程序,我用vc6 0输出0。。。我就不截图了。 看来和编译器有关。。。 2楼 匿名用户 我不能肯定,但是我认为这取决于编译器的实现,他估计是看见乘法就直接就进行符号位乘法,即正正为正 负负为正 正负为负,以此修改结果的符...