嵌入式C编程------数据类型之数据类型修饰符

C语言修饰符汇总详解 C语言的修饰符种类繁多,每个修饰符都有特定的功能,能够控制变量、函数或数据类型的行为。了解这些修饰符对于编写高效、健壮的程序非常重要。常用的修饰符包括signedunsignedconstvolatilestaticexternregister等,它们各自应用于不同的场景中。掌握修饰符的使用,将大大增强你在C语言编程中的能力,尤其是在涉及多线程编程、嵌入式开发和优化代码时,修饰符能够帮助程序更高效地管理内存和资源。 阅读详情

C语言允许修改简单数据类型的默认特征。这些数据类型修饰符主要改变允许的值的范围。

数据类型修饰符之应用于数据,而不针对函数。程序员可以在变量、参数和函数的返回值里使用它们。

某些数据类型修饰符能够同任何变量一起使用,而其他则只用于特殊类型的一个集合。

①    数值常量修饰符:const和volatile

编译器优化程序的能力依赖于多个因素,其中之一是程序里数据对象的相对持久性。默认时,程序里使用的变量是根据开发者给出的指令改变数值的。

有时,程序员想创建不能改变数值的变量。例如,如果代码中用到了∏,即常数PI,则应该在一个常数变量里指定该数值的一个近似值。

const float PI=3.1415926;

当程序被编译后,编译器为PI变量分配ROM空间并且不允许在代码中改变它的数值。例如,下面的赋值将在编译时产生一个错误。

PI=3.0;

在嵌入式C里,常量数据值的存储是从计算机程序的内部空间分配的,通常是ROM或者其他的非易失性存储体。

volatile变量是超出正执行软件范围其值就可能改变的变量。例如,一个“存储”在端口数据寄存器位置的变量将随着端口值的改变而改变。

使用volatile关键词通知编译器,它不能依赖于变量的值且不基于被赋予的值执行任何优化。

②    允许值修饰符:signed和unsigned

默认情况下,整数数据类型能够容纳负数值。可以限制整数数据类型只取正数值。整数数据类型的符号值是用signed(有符号)和unsigned(无符号)关键词来指定的。

Signed关键词迫使编译器使用整数值的高位作为符号位。如果符号位被设置为1,则变量的其余部分被解释为一个负数值。short,int和long数据类型默认为是有符号的,char数据类型默认为是无符号的。为了创建一个有符号的char变量,必须使用下面的声明:

signed char mysignedchar;

如果单独使用signed和unsigned关键词,编译器则假定正在声明一个整数值。因为int值是默认有符号的,所有程序员很少使用语法signed mysignedint;。

③    大小修饰符:short和long

修饰符short和long指示编译器应为一个int变量分配多少空间。

short关键词修改int,使它同一个char变量具有相同大小的位(通常是8位)。

short int myshortint;

入股单独使用short关键词,编译器会认为该变量是一个short int 类型。

short myshortint;

long关键词修改int,使它同一个正常的int变量一样长。

long int mylongint;

同样省略long声明后的int仍被认为是long int。

④指针范围修饰符:near和far

关键词near和far深受目标计算机体系结构的影响。

Near关键词创建一个指向可寻址内存低端部分的目标的指针。这些指针占用内存的单一字节,并且它们能够指向的内存单元被限制到256个位置,通常是0x0000~0xffff的范围里。

int near * mynintptr;

far关键词创建一个能够指向内存中任何数据的指针。

const char * mystring=“constant string”;

char far * myindex=&mystring;

这些指针需要两字节的内存,允许它们占据0x0000~0xffff之间的任何合法地址。Far指针通常指向用户ROM里的目标,如用户定义的函数和常量。

5.3.5 存储类修饰符

存储类修饰符控制已声明的修饰符的内存分配。C支持4种存储类修饰符,它们可以用于变量声明:extern,static,register,auto.只有extern用于函数声明。

当编译器读一个程序时,它必须确定如何为每个标识符分配存储空间。完成这个任务的过程被作连接。C支持3类连接:外部连接,内部连接和无连接。C使用标识符连接以分类对相同标识的多个引用。

1.外部连接

带有外部连接的标识引用在整个程序里调用内存中相同的目标。带有外部链接的标识的定义必须是唯一的,;否则,在编译器将给出一个重复符号定义的错误。默认情况下,程序中的每个函数都有外部链接。同样在默认情况下,全局范围的任何变量也都具有外部链接。

2.内部连接

在每个编译单元里,带有内部链接标识的所有引用指向内存中的相同目标。这就意味着,在程序的每个编译单元里,带有内部链接的标识的定义只能是惟一的。因为采用#include指令,一个编译单元能够多于一个文件。

默认情况下,C里没有目标具有内部链接。具有全局范围(定义在任何语句快外)并且具有static存储类修饰符的任何标识拥有内部链接。同样地,具有局部范围(定义在语句块里)并且具有static存储类修饰符的任何标识拥有内部链接。

尽管能够创建具有内部链接的局部变量,划分范围的规则把局部变量的可见性限制到它们的封闭语句块里。这意味着能够创建这样的局部变量,允许它们的值存在于它们所出现的语句块的即时生存期之外。正常情况下,计算机在多个不同的语句块间共享局部变量空间。如果一个局部变量被声明为static,则仅为该变量分配一次内存空间:发生在遇到变量的第一时间。

注意:不像其他内部链接目标,静态局部变量在编译单元里不必是独一无二的。它们必须在包含它们范围的语句块里是独一无二的。

内部链接的目标通常远远不如外部链接或者无链接的目标出现的频繁。

3.无链接

无链接标识的引用在语句块里指向内存中相同的目标。如果在一个语句块里定义了一个变量,则只能提供这种定义一次。

默认情况下,在一个语句块里声明的任何变量都是无链接的,除非ststic或者extern关键词被包含在声明中。

4.extern修饰符

extern修饰符指出该变量属于另一个模块或库。编译器可以访问该变量,当不给它分配空间。空间在定义它的那个文件中进行分配。为了是编译器知道该数据类型,必须利用extern声明。

当编译器遇到一个外部函数声明时,就将它解释为有函数名、类型和参数的一个函数原型。关键词extern宣告函数定义位于另一个编译单元。编译器把解析这个引用的任务推给链接器。

如果建立了一个应用于许多程序的函数库,并创建了一个包含extern函数声明的头文件。那么,在编译单元里包括这个头文件,以便程序员自己的代码可以得到函数库里的函数。

如同函数一样,全局变量也有外部链接。全局变量是一个展现函数库的通用配置设置的好方法。这样可以避免额外的函数调用。

为建立一个在编译单元外部可读或可设置的全局变量,必须在它的源文件里正常声明它,并在一个头文件里用extern声明它。

编译器解释一个外部声明为一个通知;实际的RAM或ROM分配发生在另一个编译单元里。

5.static修饰符

默认情况下,在全局空间里声明的所有函数和变量具有外部链接并且对整个程序是可见的。有时需要具有内部链接的全局变量或者函数:它们应该在一个单一的编译单元里是可见的,但在外部则不可见。使用static关键词限制变量的范围。

当它用于某函数块内部时,static修饰符促使编译器创建一个持久性存储数据。所以该数据在此函数外部是持久的。若没有使用static修饰符,该变量可能是自动的变量,它使用栈空间。

在函数内部使用static修饰符通常被认为不是好的编程习惯。在主调例程中,程序员应当首先考虑是使用全局变量还是自动变量会更好些。在协同多任务程序中,通常static修饰符用得较多。但要注意:可能会造成非可重入的 函数。

6.register修饰符

当使用register修饰符时,编译器便试图将CPU寄存器分配给数据。但若该寄存器必须用于其他操作,则数据就转到栈上临时存储。此类修饰符能够减少程序尺寸与执行时间,但它仅对于较简单程序有效。

不像其他存储类修饰符,register只是给编译器一个简单的建议。如果没用用于分配的寄存器,则编译器可能使用正常内存空间。

因为在8位机器上寄存器的匮乏以及空间优化胜过速度,所以对嵌入式程序员而言,register关键词没有太大的用处。

7.auto修饰符

关键词auto指示一个临时变量(与static相反)。C在一个语句块内部都不支持函数,所以auto只能用于局部变量。既然默认情况下在以语句块里声明的所以变量是无链接的,那么使用auto关键词的惟一理由是提供代码清晰度。

8.volatile修饰符

volatile修饰符用于指出当其他某种异步事件发生时数据内容会发生改变。结果,它告诉编译器,该数据无任何持久性。异步事件包括外部硬件事件、中断驱动事件,以及在可抢占性多任务系统中从别的任务来的任务间事件。易失性数据对象的最普通的例子是通用输入或通用I/O端口数据。它迫使编译器每次需要此数据内容时都必须读该单元,而不是只读一次数据并将它放在寄存器中以便后续访问之用、从而使程序优化。

9.const修饰符

该修饰符用于声明存储常量。它促使编译器将常量值存入ROM中所分配的空间。当是使用const修饰符时,必须将数据对象初始化。如果程序员试图改变存储常量的值,编译器便会给出出错信息。这个修饰符很少用在通用计算机应用程序中,因为它的一切数据对象都存放在RAM中。

C语言中的类型修饰符 C语言中的类型修饰符说明,简单的资料,应该有点用 立即下载

相关推荐

Mac 环境配置jdk、Maven

3、终端打开配置jdk时候建好的脚本文件: open -e .bash_profile。4、查看maven是否安装成功和系统能不能识别maven/mvn命令:⬇️。输入⬇️并保存: 其中第一行JAVA_HOME替换为自己下的jdk路径。,安装编译好的二进制版本,具体安装zip还是tar.gz我看的。5、查看jdk是否安装成功和系统能不能识别java命令:⬇️。至此,我的Mac系统的环境配置jdk、Maven完成!然后就发现我的maven命令还是没作用,不识别,下载后直接安装即可,很快,点几下就OK了。

weixin_42416791的博客 4402

C语言 数据类型修饰符与存储类修饰符

C语言允许修改简单数据类型的默认特征。这些数据类型修饰符主要改变允许的值的范围。数据类型修饰符之应用于数据,而不针对函数。程序员可以在变量、参数和函数的返回值里使用它们。某些数据类型修饰符能够同任何变量一起使用,而其他则只用于特殊类型的一个集合。①    数值常量修饰符:const和volatile编译器优化程序的能力依赖于多个因素,其中之一是程序里数据对象的相对持久性。默认时,程

积累与分享 5107

STM32N6570-DK ISP调试

将下载线接入STLINK V3EC接口,将BOOT1拨码拨至右边,即将其置为H,上电或已经上电的按复位,打开STM32CubeProgrammer,设置start address:0x70000000。板子消耗电流较大,即使缩短数据线接了USB供电依然不能正常点亮显示屏,最终通过板上CN2端子加了外部5V供电,仍然需要560mA的外部电流。3.烧录bin文件:STM32N6_ISP_IQTune_App_revC01-v1.1.0-trusted.bin。

liu的博客 1065

C语言修饰符

常见修饰符 auto: //默认修饰符 register: register int a; //寄存修饰符 用于定义一些快速访问的变量 编译器会尽量的安排CPU的寄存器去存放这个a,如果寄存器不足时,a还是放在存储器中 取地址符&对register不起作用 寄存器在cpu中,数据存储其中访问速度很快 数据放在存储器(内存)中,访问速度相对很慢 static: 修饰三种数据: 1.函数内部的变量(局部变量):static修饰的局部变量存放在全局数据区的静态变量区。static修饰的局部变

Cupido 1万+

【COMSOL超材料和超表面仿真设计】

超材料和超表面的设计通常需要自定义材料属性。在COMSOL中,可以通过定义介电常数和磁导率的张量来模拟超材料的特性。对于超表面,通常需要定义表面阻抗或等效电路模型。

weixin_51101456的博客 1665

从硬件到软件:TSMaster报文过滤全链路配置指南(含同星设备适配)

本文详细介绍了TSMaster平台下CAN/LIN/FlexRay总线的报文过滤全链路配置指南,特别针对同星TC1016等硬件的兼容性进行实战演示。从硬件层预过滤到软件层可编程过滤,提供五维过滤体系构建方法,帮助工程师提升车载诊断与总线分析效率。重点解析混合总线过滤策略优化及诊断场景下的特殊过滤方案。

tensorflowjs6的博客 402

c语言的关键字之修饰符

c语言关键字 1、const(被修饰的量不可修改) const修饰的是在它前面的类型,如果它前面没有类型,那它修饰的是紧跟着它的那个类型。 const type name =value 或 type const name =value 1.1、修饰变量类型 const int i =0; 修饰后面的int 等价于 int const i=0; 修饰前面的int 1.2、修饰指针变量类型 const int *pi =0; pi是一个指向const int 的指针,复引用此运算符为得...

RONG_YAO的博客 4766

LTSPICE使用教程:入门指导

LTSPICE仿真工具入门指导

焊武大帝的专栏 5万+

C语言类型修饰符总结

1、int float double char [signed unsigned short long (long long)]修饰int时,都可省略int, 2、作用:说明一个变量的类型,便于区分及优化内存 3、 signed -->能修饰    int和char           %d unsigned -->能修饰  int 和char          %u

wojiaojiaojuanjuan的博客 5796

OpenCV-Python实战(11)——OpenCV轮廓检测相关应用

在计算机视觉领域,轮廓通常指图像中对象边界的一系列点。因此,轮廓通常描述了对象边界的关键信息,包含了有关对象形状的主要信息,该信息可用于形状分析与对象检测和识别。在本文中,我们将学习如何利用获取到的轮廓,进行形状分析以及对象检测和识别。

盼小辉丶的博客 1万+

物理AI:连接数字智能与物理世界的下一代人工智能范式

物理AI正在推动人工智能从纯数字领域向物理世界扩展,实现比特到原子的智能跃迁。与传统AI相比,物理AI具有三大核心差异:1)在物理环境中运行;2)处理多模态传感器输入;3)产生可改变物理状态的输出。其技术栈包含感知层(多模态融合)、决策层(边缘计算)、执行层(运动控制)和连接层(5G/6G通信)。关键技术挑战包括:实时多传感器融合、物理约束下的决策规划、以及高精度执行控制。物理AI的发展面临实时性保障、安全验证等核心挑战,但其在机器人、自动驾驶等领域的应用潜力巨大,正成为智能技术落地的关键突破口。

fudaihb的博客 1712

c语言中的修饰符大全

6. volatile:易失变量修饰符,用于定义易失变量,易失变量的值可能会被意外修改,编译器不会对其进行优化。3. static:静态变量,用于在函数内部或全局范围内定义静态变量,静态变量在程序执行期间只被初始化一次。2. register:寄存器变量,用于定义存储在寄存器中的变量,不能对寄存器变量使用取地址符。4. extern:外部变量,用于在一个文件中引用另一个文件中定义的全局变量或函数。5. const:常量修饰符,用于定义常量,常量的值不能被修改。

2301_79584946的博客 1563

C++高级数据结构算法 | 二叉树的四种遍历算法详解(递归与非递归实现)

二叉树遍历方法 、前序遍历算法 、中序遍历算法 、后序遍历算法 、层序遍历算法

ZY-JIMMY 2565

嵌入式C语言常见面试题目

一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a 的bit 3。②懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。

m0_59978128的博客 347

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

嵌入式(C)笔试题

嵌入式(C)笔试题 1 读程序段,回答问题 (a) int main(int argc,char *argv[]) { int c=9,d=0; c=c++%5; d=c; printf("d=%d\n",d); return 0; } a) 写出程序输出 b) 在一个可移植的系统中这种表达式是否存在风险?why?答案:5存在风险,因为c=c++...

小时候挺菜的博客 558

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

嵌入式C必看(关键字)

嵌入式C语言,面向内存编程

sdjgh的博客 635

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C语言-数据类型-01基本数据类型-01、整型

本文系统介绍了C语言中整型数据的概念、语法、修饰符、存储方式及进制转换等内容。整型数据包括short、long、long long等类型,可使用unsigned修饰去除符号位。不同系统下整型占用字节数不同,可通过sizeof获取。计算机存储有符号数时采用补码形式。文章详细讲解了十进制、八进制和十六进制的表示方法及相互转换规则,包括二进制与十六进制/八进制的互转方法。同时介绍了整型常量的类型判定和格式控制符的使用,以及不同进制数的加减运算规则。这些基础知识对理解计算机数据存储和进行底层编程至关重要。

m0_61594081的博客 1215

深入学习C语言 :数据类型与变量

目录引言数据类型变量常量小结引言C语言是一种广泛应用于系统编程、嵌入式系统、游戏开发等领域的高级编程语言。在学习C语言的过程中,了解数据类型和变量的概念是非常重要的。

2301_82278282的博客 338

C语言数据类型详解:从基础到应用实践

数据类型是编程语言中定义数据存储格式与操作方式的基础概念。在C语言中,数据类型系统直接影响内存使用效率、计算精度和程序安全性。整型、浮点型等基本数据类型决定了数值的存储范围和运算规则,而指针、结构体等派生类型则提供了更灵活的内存管理能力。理解数据类型的底层原理对开发高性能、跨平台应用至关重要,特别是在嵌入式系统、金融计算等对精度和效率要求严格的场景中。通过合理选择数据类型和避免常见陷阱(如整数溢出、浮点精度误差),可以显著提升代码质量和运行效率。本文以C语言为例,深入解析数据类型的选择策略与实际工程应用技巧

weixin_33733810的博客 408

C语言标准的区别,MCS的C语言和标准C语言的区别.ppt

MCS的C语言和标准C语言的区别MC9S12的C语言与标准C语言的区别 1、C语言程序设计特点 单片机编程语言?? 汇编语言????? 优点:执行效率高,时序控制精确 ?? C语言?????? 优点: 程序开发速度快,提高开发工作效率;???????????????????? 软件调试直观;???????????????????? 可维护性好;???????????????????? 可移植性好...

weixin_36037417的博客 215

c++zrr_7.7

形继承存在的问题(具体阐述什么问题),由于只需要保留一份中间子类从公共基类继承下来的数据成员,程序不知该保留哪个中间子类的,所以就会直接调用公共基类的无参构造,导致公共基类的数据成员无法初始化,所以需要在汇聚子类中手动调用公共基类的有参构造函数,来完成公共基类的数据成员初始化操作。申请了char类型大小的空间。因为父类的指针指向子类对象,只作用于子类从父类继承下来的那片空间,如果释放父类指针,那么只会释放子类从父类继承下来的那片空间,而子类自己拓展的空间,并没有得到释放,造成内存泄漏。

2301_80665732的博客 819

C语言学习相关知识

1. sbit 寻址位地址(51)2. define 变量赋值,可以是形参或实参3. code 表示数据存储在ROM中8位编译器(例如51系列)char:1个字节char*(即指针变量): 2个字节 short int : 2个字节int:2个字节2个字节float: 4个字节double: 8个字节long: 4个字节long long: 8个字节unsigned long: 4个字节32位编译器(例如32系列)char:1个字节。

qq_57628024的博客 215

记录一些小细节

一些记录

weixin_66375860的博客 543

C语言的修饰符

目录C语言的修饰符 C语言的修饰符 本篇文章打算介绍一下有关C语言中修饰符的有关知识。

aa98865646的博客 981

嵌入式开发--C语言之语法概述(1.2)

C语言之语法概述1.GCC介绍和使用1.1介绍1.2gcc概述1.3C语言编译过程介绍1.4C语言编译常见错误举例1.5C语言预处理介绍1.6条件预处理的应用1.7宏展开下的#、##使用2.C语言常用关键字及运算符操作2.1C语言常用关键字及运算符课程介绍2.2关键字概念及sizeof、return2.3数据类型关键字介绍及char类型2.4数据类型之int、long、short大小: 根据编译器来决定 编译器最优的处理大小: 系统一个周期,所能接受的最大处理单位,int

小张_Zafir 2925

C 语言在嵌入式系统编程中的应用有哪些?C 语言中的常见算法有哪些?C 语言中的数据类型有哪些?C 语言中的宏定义有哪些用途?

嵌入式系统编程是指针对嵌入式系统设计和开发软件的过程。嵌入式系统是指集成在其他设备或系统中的计算机系统,其目的是控制和执行特定功能。这些系统通常具有有限的资源,如处理器速度、存储器容量和功耗要求。C语言在嵌入式系统编程中被广泛应用。以下是C语言在嵌入式系统编程中的常见应用:控制系统开发:C语言在工业控制、汽车电子、航空航天和家用电器等领域的控制系统开发中得到广泛应用。通过C语言,开发人员能够编写高效且可靠的控制算法和逻辑。设备驱动程序:C语言可用于编写设备驱动程序,使嵌入式系统能够与外部设备进行通信。

fengyege的博客 741
下一篇: linux驱动学习--串口相关---知识汇总
nice0513
博客等级 码龄18年 10粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值