C语言里怎样理解长整型 短整型 和无符号型变量和常量?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言里怎样理解长整型 短整型 和无符号型变量和常量?相关的知识,希望对你有一定的参考价值。

长整型 短整型 和无符号型跟基本整形 我就知道所占字节不同
但是长整型 短整型怎样理解?它们跟基本整形有什么区别?
还有无符号怎么理解 怎么表示 用什么进制 ?
我真的不大懂
有哪位好心的愿意帮帮我 我qq277620691谢谢

  1、变量:是一块内存区域,一块内存包含两个属性,一个是地址,一个是存储的内容,即值。所以在c语言中每个变量都有一个地址,也有自己存储的内容。
  2、常量:指的是不会被修改的量,这个概念实际上来自汇编语言中的立即数概念,它是存储于指令代码中的。
  3、整型:用于描述整数的数据类型。
  4、长整型、 短整型 、无符号整型,主要是通过整数的符号以及所占内存字节的大小来区分的,做为整数可以分为正数和负数,因此C语言中有了无符号数和有符号数的区别,无符号整型,最小值是0,最大值为2^n-1,n是在内存中类型所占的字节数。 一般来说,int类型占4个字节,short短整型占2个字节,long长整型占4或者8个字节。具体所占字节的大小可以通过sizeof运算符来获取。
参考技术A

进制一般来说都是10进制,下面以10进制为例。

不同整型可以表示的范围不同,可以根据实际需要选择不同的整形。

各种整形的范围请参见下表。

至于原理就涉及到二进制等知识了,初学C语言没必要深究,一般整形只用int类型就足够了。

如下网址可以搜到“C语言数据类型”相关课件。

http://www.baidu.com/s?wd=C%E8%AF%AD%E8%A8%80+%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B+filetype%3Appt&tn=site888_1_pg&cl=3&ie=utf-8

参考技术B 但是长整型 短整型怎样理解?它们跟基本整形有什么区别?
short int <= int <= long int
定义这三种是为了节约存储空间
在保证数据不溢出的情况下选择需要空间最短的

unsign int 是在都为正数的情况下节约存储空间而定义的

都是2进制储存在内存中本回答被提问者采纳
参考技术C 因为字节数不同,所以能表示的数的范围就不一样了啊.
无符号就是不把最高位看成符号位.比如11111111,有符号数是把最高位的1看成符号位,表示负数,11111111就表示-1.无符号数则把最高位的1也看成是数的一部分,1111111就表示65535.
参考技术D 无符号和有符号的区别就是存数据时有符号的数据在存储单元留出一位保留符号。而无符号的则不用留出一位来保留符号,所以无符号的数据存贮的最大位数比有符号的大一位所以其相当于左移一位,也就是通常看到的无符号的数据的取值范围是有符号的数的2倍。

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语言里怎样理解长整型 短整型 和无符号型变量和常量?的主要内容,如果未能解决你的问题,请参考以下文章

问C语言编程所涉及英文单词或函数的中英文对照表

C语言数据类型一文详解

C语言 四种基本数据类型

C语言的内存分配

有符号和无符号整型数据溢出问题

C语言的内存分配