C语言中有符号基本整型[signed]int 取值范围(-32768——32767)是怎么算出来的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中有符号基本整型[signed]int 取值范围(-32768——32767)是怎么算出来的?相关的知识,希望对你有一定的参考价值。
以最高位为符号位,二进制原码最大为0111111111111111=2的15次方减1=32767最小为1111111111111111=-2的15次方减1=-32767。
此时0有两种表示方法,即正0和负0:0000000000000000=1000000000000000=0所以,二进制原码表示时,范围是-32767~-0和0~32767,因为有两个零的存在,所以不同的数值个数一共只有2的16次方减1个,比16位二进制能够提供的2的16次方个编码少1个。
但是计算机中采用二进制补码存储数据,即正数编码不变,从0000000000000000到0111111111111111依旧表示0到32767,而负数需要把除符号位以后的部分取反加1,即-32767的补码为1000000000000001。
补码系统中,范围是-23768~32767。因此,实际上,二进制的最小数确实是1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的1111111111111111是二进制值的-1。
扩展资料
C语言double大小和取值范围
占用的字节数:
printf("float:bytes%d;bit%d\\n",sizeof(float),sizeof(float)*8);
double:bytes8;bit64
取值范围:C标准规定,double类型至少能表示10位有效数字。一些系统将多出来的32bit都来表示尾数部分,这就至少有13位有效数字了,这也超出了c规定的最小标准了。
参考技术A 1 111 1111 1111 1111第一个1表示负数【符号位】
对负数要按位求反+1
1 000 0000 0000 0001
就是-1
1 000 0000 0000 0000
才是最大负数
被定为-32768
0 000 0000 0000 0000
才是0
0 111 1111 1111 1111
第一个0表示正数【符号位】
+(1*2^14+1*2^13+1*2^12+..1*2^0)=32767 参考技术B [signed]int 是由2个字节组成,每个字节8bit,共16bit。也就是-2^15~~~2^15-1,
C语言的内存分配
在ANSI C中数据类型包括:整形,浮点型,指针和聚合型(如数组和结构等)
整形:
字符,短整型,整型和长整型,他们都分别有有符号(singed)和无符号(unsingned)
取值范围:
没有带signed或者unsigned,默认signed
长整型至少应该和整型一样长,而整型至少应该和短整型一样长
在32位环境中,各种数据类型的长度一般如下:
ARM C
具体我们以IAR为编译器,版本7.2
注意:
在32位ARM中,字是32位,半字是16位,字节是8位
可以看到以下关于整型的数据类型
下面使用typedef重新定义数据类型,没有使用到long,因为都是32位的有一个int就够了
C语言内存分配方法
在标准C语言中,编译出来的可执行程序分为代码区(text)、数据区(data)和未初始化数据区(bss)3个部分。如下代码
使用linux编译之后得到的可执行文件如下
可以看到代码区(text)、数据区(data)和未初始化数据区(bss)。
代码段(text):存放代码的地方。只能访问,不能修改,代码段就是程序中的可执行部分,直观理解代码段就是函数堆叠组成的。
数据段(data):全局变量和静态局部变量存放的地方。也被称为数据区、静态数据区、静态区:数据段就是程序中的数据,直观理解就是C语言程序中的全局变量。注意是全局变量或静态局部变量,局部变量不算。
未初始化数据区(bss):bss段的特点就是被初始化为0,bss段本质上也是属于数据段。
那么问题来了,为什么要区分data段和bss段呢?
以下面代码为例,a.c和b.c的差异只是有没有给arr数组赋值。
可以看到a.out的bss段大,b.out的data段大。但是b.out的文件大小明显比a.out的大很多。
那么就可以简单理解为,data段会增大可执行文件的大小,而bss段不会。
这里我说下自己的理解,我并没有找到资料验证:
data段是全局变量,但是需要初始化值,上面我的例子是全部初始全部为1,但也可能是1024*1024个不同的数据,而这些数据需要保存起来,表现出来也就是需要保存在可执行文件中。
bss段也是全局变量,但不需要初始化值,只需要保存一下这个全部变量的保存的数据类型和大小即可。即使它的数组容量是1024*1024,也不会占用很多可执行文件的大小。
这里再说明一个问题:如果一个全部变量初始化为0,那么它也是bss段,不是data段,即使你代码中把它初始化为0了。这点大家可以自行验证。
关于数据段,也就是data段,也会分为RO data(只读数据段)和RW data(读写数据段)。
从字面意思就可以区分他们的意思,不同的是:
只读数据段:程序使用的一些不会被更改的数据,使用这些数据的方式类似查表式的操作,由于这些变量不需要更改,因此只需要放置在只读存储器中即可。
读写数据段:程序中是可以被更改的数据,且初始化过的,所以需要放置在RAM中,且初始化的内容放在存储器中(表现为放入可执行文件中)。
这样又可以分区只读区和读写区域,如下所所示(当然bss段和下文的堆栈也是读写区)
上面说到“编译出来的可执行程序分为代码区(text)、数据区(data)和未初始化数据区(bss)3个部分”,那运行中就会多出来一些区域,这就是我们常说的堆栈,注意堆栈是两个区域堆和栈。
栈:局部变量、函数一般在栈空间中。运行时自动分配&自动回收:栈是自动管理的,程序员不需要手工干预。方便简单。是提前分配好的连续的地址空间。栈的增长方向是向下的,即向着内存地址减小的方向。
堆:堆内存管理者总量很大的操作系统内存块,各进程可以按需申请使用,使用完释放。程序手动申请&释放:手工意思是需要写代码去申请malloc和释放free。可以是不连续的地址空间。堆的增长方向是向上的,即向着内存地址增加的方向。
下面是简单的演示代码
运行结果如下
内存分配示意图如下
【学习资料】给大家分享一些c语言学习资料,感兴趣的点击下方链接学习。
学习交流群:881895560
C语言编程基础
指针
C语言控制led灯
C语言实现面向对象编程
数据类型、常量、变量及运算符
C语言与数据结构的经典实战案例
Linux C语言高级开发
必备Linux命令和C语言基础
以上是关于C语言中有符号基本整型[signed]int 取值范围(-32768——32767)是怎么算出来的?的主要内容,如果未能解决你的问题,请参考以下文章
为啥C语言中有符号整型变量的取值范围是-32768~32767,麻烦详细解释一下?