NEC CC78K0S User Manual

用户手册
CC78K0S
C 编译程序 版本 1.30 或更高
语言
目标设备 78K/0S 系列
2001©
日本印刷
[备忘录]
用户手册 U14872CA1V0UM 2
Windows Windows NT 是微软公司在美国和/或其他国家的注册商标或商标。 PC/AT 是国际商用机器公司的商标。 i386 是英特尔公司的商标。 UNIX 是在美国和其他国家的注册商标,并通过 X/Open 有限公司独家许可。 SPARCstationSPARC 国际公司的商标。 SunOS Solaris Sun 微系统公司的商标。 HP9000 series 700HP-UX 是惠普公司的商标。
用户手册 U14872CA1V0UM 3
z 本文档所刊登的内容有效期截至 2007 8 月。将来可能未经预先通知而更改。在实际进行生产设计
时,请参阅各产品最新的数据表或数据手册等相关资料以获取本公司产品的最新规格。
z 并非所有的产品和/或型号都向每个国家供应。请向本公司销售代表查询产品供应及其他信息。
z 未经本公司事先书面许可,禁止复制或转载本文件中的内容。否则因本文档所登载内容引发的错误,
本公司概不负责。
z 本公司对于因使用本文件中列明的本公司产品而引起的,对第三者的专利、版权以及其它知识产权的
侵权行为概不负责。本文件登载的内容不应视为本公司对本公司或其他人所有的专利、版权以及其它
知识产权作出任何明示或默示的许可及授权。
z 本文件中的电路、软件以及相关信息仅用以说明半导体产品的运作和应用实例。用户如在设备设计中
应用本文件中的电路、软件以及相关信息,应自行负责。对于用户或其他人因使用了上述电路、软件
以及相关信息而引起的任何损失,本公司概不负责。
z 虽然本公司致力于提高半导体产品的质量及可靠性,但用户应同意并知晓,我们仍然无法完全消除出
现产品缺陷的可能。为了最大限度地减少因本公司半导体产品故障而引起的对人身、财产造成损害
(包括死亡)的危险,用户务必在其设计中采用必要的安全措施,如冗余度、防火和防故障等安全设
计。
z 本公司产品质量分为:
标准等级专业等级以及特殊等级三种质量等级。
特殊等级仅适用于为特定用途而根据用户指定的质量保证程序所开发的日电电子产品。另外,各种日
电电子产品的推荐用途取决于其质量等级,详见如下。用户在选用本公司的产品时,请事先确认产品的
质量等级。
标准等级: 计算机,办公自动化设备,通信设备,测试和测量设备,音频·视频设备,家电,加工
机械以及产业用机器人。
专业等级: 运输设备(汽车、火车、船舶等),交通用信号控制设备,防灾装置,防止犯罪装
置,各种安全装置以及医疗设备(不包括专门为维持生命而设计的设备)。
特殊等级: 航空器械,宇航设备,海底中继设备,原子能控制系统,为了维持生命的医疗设备、
用于维持生命的装置或系统等。
除在本公司半导体产品的数据表或数据手册等资料中另有特别规定以外,本公司半导体产品的质量等级
均为标准等级。如果用户希望在本公司设计意图以外使用本公司半导体产品,务必事先与本公司销售
代表联系以确认本公司是否同意为该项应用提供支持。
(注)
(1) 本声明中的“本公司”是指日本电气电子株式会社(NEC Electronics Corporation)及其控股公司。
2) 本声明中的本公司产品是指所有由日本电气电子株式会社所开发或制造,或为日本电气电子株式会社
(定义如上)开发或制造的产品。
用户手册 U14872CA1V0UM 4
区域信息
本文档中的某些信息可能因国家不同而有所差异。用户在使用任何一种 NEC 产品之前,请与当地的 NEC 办事处联 系,以获取权威的代理商和发行商信息。请验证以下内容:
z 设备的可用性 z 定货信息 z 产品发布进度表 z 相关技术资料的可用性 z 开发环境要求(例如:要求第三方工具和组件,主计算机,电源插头,AC 供电电源等) z 网络要求
此外,对于商标、注册商标、出口限制条款和其他法律规定,不同的国家也有不同的要求。
详细信息请联系:
(中国区)
网址:
http://www.cn.necel.com/ http://www.necel.com/
[北京]
日电电子(中国)有限公司 中国北京市海淀区知春路 27 号 量子芯座 7,8,9,15 层 电话:(+86)10-8235-1155 传真:(+86)10-8235-7679
[深圳]
日电电子(中国)有限公司深圳分公司 深圳市福田区益田路卓越时代广场大厦 39 390139023909 室 电话:(+86)755-8282-9800 传真:(+86)755-8282-9899
[上海]
日电电子(中国)有限公司上海分公司 中国上海市浦东新区银城中路 200 号 中银大厦 2409-2412 和 2509-2510 室 电话:(+86)21-5888-5400 传真:(+86)21-5888-5230
上海恩益禧电子国际贸易有限公司 中国上海市浦东新区银城中路 200 号 中银大厦 2511-2512 电话:(+86)21-5888-5400 传真:(+86)21-5888-5230
[香港]
香港日电电子有限公司 香港九龙旺角太子道西 193 号新世纪广场 第 2 座 16 楼 1601-1613 室 电话: (+852)2886-9318 传真: (+852)2886-9022
2886-9044
用户手册 U14872CA1V0UM 5
引言
CC78K0S C 编译器(下文称为该 C 编译器)是根据美国信息系统(C 编程语言)国家标准草案(1988 12 7
日)中的第二章 环境和第三章 语言编写的。因此,使用本 C 编译器可以对符合 ANSI 标准的 C 语言源程序进行编译, 可以开发 78K/0S 系列应用产品。
CC78K0S C 编译器语言篇》(本手册)是为了让那些使用本 C 编译器进行软件开发的用户能够正确了解本 C
译器的基本函数及语言规范而编写的。
本手册不介绍如何操作本 C 编译器。因此,在您掌握了本手册的内容后,请阅读《CC78K0S C 编译器操作篇
(U14871E)
关于 78K/0S 系列的体系结构,敬请参阅 78K/0S 系列各个产品的用户手册。
用户手册 U14872CA1V0UM 6
[目标设备] 可以使用本 C 编译器开发 78K/0S 系列微控制器的软件。 请注意,开发时需要一个与目标设备对应的设备文件。
[读者对象] 尽管本手册适用于那些已经阅读过微控制器用户手册且具有软件开发经验的读者,但是 C 编译器或 C 语言方面的知识 对于本手册的读者来说不是必须的。本手册中的内容假设读者熟悉软件术语。
[组织结构] 本手册由以下 13 章及附录组成。
1 章 概述 概括介绍该 C 编译器的一般功能、性能指标及特色。 第 2 C 语言的结构 介绍 C 源程序模块文件的构成要素。 第 3 章 数据类型与存储类的声明 介绍 C 中使用的数据类型及存储类,以及如何声明数据对象或函数的类型及存储类。 第 4 章 类型转换 介绍本 C 编译器自动执行的数据类型转换。 第 5 章 运算符与表达式。 介绍 C 中使用的运算符和表达式,以及运算符的优先级。 第 6 C 语言的控制结构 介绍 C 的程序控制结构及在 C 中执行的语句。
章 结构体与共用体
7 关于结构体与共用体的概念,以及如何引用结构体与共用体成员。 第 8 章 外部定义 介绍外部定义的类型,以及如何使用外部定义。 第 9 章 预处理指令 详细介绍预处理指令的类型,以及如何使用预处理指令。 第 10 章 库函数 详细介绍 C 库函数的类型,以及如何使用各个库函数。 第 11 章 扩展函数 介绍该 C 编译器的扩展函数,以便用户最大限度地发挥目标设备的功能。 第 12 章 汇编程序与 C 程序之间的引用和兼容性 介绍将 C 源程序与用汇编源程序连接的方法。 第 13 章 编译器的高效使用 概括介绍如何更有效地使用本 C 编译器。
附录 A~E
包含 saddr 区域标签列表、段名列表、运行时刻库列表、库堆栈占用列表及快速参考索引。
用户手册 U14872CA1V0UM 7
[手册使用方法]
对于不熟悉 C 编译器或 C 语言的读者: 从第 1 章开始阅读,因为本手册涵盖了从 C 的程序控制结构到本 C 编译器的扩展函数内容。 在第 1 章中,使用一
C 源程序示例来介绍本手册中的引用部分。
对于熟悉 C 编译器或 C 语言的读者: C 编译器的语言规范符合 ANSI 标准 C 因此,您可以从第 11 章开始,该章介绍了本 C 编译器特有的扩展函
数。 在阅读第 11 章时,如有必要,还可以参考随 78K/0S 系列中的目标设备附带的用户手册。
[相关文档]
文档名称 文档编号
CC78K0S C 编译器使用用户手册
U14871E
[参考文献] 美国信息系统(C 编程语言)国家标准草案(1988 12 7 日)
[术语]
RTOS = 78K/0 系列实时操作系统 RX78K0
[约定]
本手册中使用了以下符号及缩写。
符号 含义
⋅⋅⋅ 相同格式的数据的连续(重复) “ ” 括在双引号中的字符必须原样输入。 ‘ ’ 括在单引号中的字符必须原样输入。 本部分程序描述被省略
/ 定界符 \ 反斜线 [ ] 方括号中的参数可以被省略。
用户手册 U14872CA1V0UM 8
目录
1 章 概述 ...................................................................................................................21
1.1 C语言与汇编语言 .........................................................................................................21
1.2 使用C编译器的程序开发过程 .......................................................................................23
1.3 C源程序的基本结构...................................................................................................... 25
1.3.1 程序格式................................................................................................................ 25
1.4 程序开发前的提示 ........................................................................................................28
1.5 C编译器的特色 .........................................................................................................30
(1) callt/_ _callt 函数.................................................................................................. 30
(2) 寄存器变量 ............................................................................................................ 30
(3) saddr区域的使用 .................................................................................................. 30
(4) sfr 区域 ................................................................................................................. 30
(5) noauto 函数.......................................................................................................... 31
(6) norec/_ _leaf 函数 ................................................................................................ 31
(7) 位型变量与 boolean/_ _boolean 型变量 .............................................................. 31
(8) ASM语句 ............................................................................................................... 31
(9) 中断函数................................................................................................................ 31
(10) 中断函数修饰符 ..................................................................................................... 31
(11) 中断函数................................................................................................................ 31
(12) CPU控制指令 ........................................................................................................ 31
(13) 绝对地址访问函数 ................................................................................................. 31
(14) 位域声明................................................................................................................ 31
(15) 更改编译器输出区名称的函数................................................................................ 32
(16) 二进制常量描述函数 .............................................................................................. 32
(17) 模块名更改函数 ..................................................................................................... 32
(18) 循环移位函数......................................................................................................... 32
(19) 乘法函数................................................................................................................ 32
(20) 除法函数................................................................................................................ 32
(21) BCD操作函数 ........................................................................................................ 32
(22) 数据插入函数......................................................................................................... 32
(23) 静态模式................................................................................................................ 32
(24) 类型更改................................................................................................................ 32
(25) Pascal 函数(_ _pascal.................................................................................... 32
(26) 函数调用接口的自动pascal函数化 ......................................................................... 32
(27) 参数/返回值的 int 扩展限制方法............................................................................ 33
(28) 数组偏移量计算简化方法....................................................................................... 33
(29) 寄存器直接引用函数 .............................................................................................. 33
(30) 内存操作函数......................................................................................................... 33
(31) 绝对地址分配规范 ................................................................................................. 33
(32) 静态模式展开规范 ................................................................................................. 33
(33) 临时变量................................................................................................................ 33
用户手册 U14872CA1V0UM 9
(34) 支持序言/尾声的库 .................................................................................................33
2 C语言的结构 ..................................................................................................... 34
2.1 字符集 ...........................................................................................................................35
(1) 字符集....................................................................................................................35
(2) 转义字符序列 .........................................................................................................36
(3) 三字符序列.............................................................................................................36
2.2 关键字 ...........................................................................................................................37
(1) ANSI-C关键字........................................................................................................37
(2) CC78K0S增加的关键字......................................................................................37
2.3 标识符 ...........................................................................................................................38
2.3.1 标识符的作用域范围...............................................................................................39
(1) 函数作用域.............................................................................................................39
(2) 文件作用域.............................................................................................................39
(3) 块作用域 ................................................................................................................40
(4) 函数原型作用域......................................................................................................40
2.3.2 标识符的连接 .........................................................................................................40
(1) 外部连接 ................................................................................................................40
(2) 内部连接 ................................................................................................................40
(3) 无连接....................................................................................................................40
2.3.3 标识符名字空间......................................................................................................41
2.3.4 对象的存储时间......................................................................................................41
(1) 静态存储时间 .........................................................................................................41
(2) 自动存储时间 .........................................................................................................41
2.3.5 数据类型 ................................................................................................................41
(1) 基本类型 ................................................................................................................42
(2) 字符类型 ................................................................................................................46
(3) 不完全类型.............................................................................................................46
(4) 派生类型 ................................................................................................................46
(5) 标量类型 ................................................................................................................47
2.3.6 相容类型兼容类型和复合类型 ................................................................................48
(1) 兼容类型相容举型 ..................................................................................................48
(2) 复合类型 ................................................................................................................48
2.4 常量...............................................................................................................................49
2.4.1 浮点型常量.............................................................................................................49
2.4.2 整型常量 ................................................................................................................49
(1) 十进制常量.............................................................................................................49
(2) 八进制常量.............................................................................................................50
(3) 十六进制常量 .........................................................................................................50
2.4.3 枚举常量 ................................................................................................................50
2.4.4 字符常量 ................................................................................................................51
2.5 字符串文字....................................................................................................................51
2.6 运算符 ...........................................................................................................................51
用户手册 U14872CA1V0UM 10
2.7 定界符 ..........................................................................................................................52
2.8 头文件名.......................................................................................................................52
2.9 注释 ..............................................................................................................................52
3 数据类型与存储类的声明 ...................................................................................53
3.1 存储类说明符................................................................................................................54
(1) typedef .................................................................................................................. 54
(2) extern .................................................................................................................... 54
(3) static...................................................................................................................... 54
(4) auto ....................................................................................................................... 54
(5) register.................................................................................................................. 54
3.2 类型说明符 ...................................................................................................................55
3.2.1 结构体说明符与联合体共用体说明符 ..................................................................... 57
(1) 结构体说明符......................................................................................................... 57
(2) 共用体说明符......................................................................................................... 57
(3) 位段位域................................................................................................................ 58
3.2.2 枚举说明符 ............................................................................................................ 59
3.2.3 标记....................................................................................................................... 60
3.3 类型修饰符 ...................................................................................................................61
3.4 说明符 ..........................................................................................................................62
3.4.1 指针说明符 ............................................................................................................ 62
3.4.2 数组声明符说明符 ......................................................................................................... 63
3.4.3 函数声明符说明符(包括原型声明) ..................................................................... 63
3.5 类型名 ..........................................................................................................................64
3.6 typedef 声明 ................................................................................................................65
3.7 初始化 ..........................................................................................................................67
(1) 具有静态存储时间存储生存期的对象的初始化....................................................... 67
(2) 具有自动存储时间存储生存期的对象的初始化....................................................... 67
(3) 字符数组的初始化 ................................................................................................. 67
(4) 聚合或共用体型对象的初始化................................................................................ 68
4 类型转换 ............................................................................................................70
4.1 算术运算数 ...................................................................................................................72
(1) 字符与整数(一般整型提升)................................................................................ 72
(2) 带符号有符号整数与无符号整数 ............................................................................ 72
(3) 通常常见算术类型转换 .......................................................................................... 73
4.2 其他运算数 ...................................................................................................................74
(1) 左值与函数定位符 ................................................................................................. 74
(2) void ....................................................................................................................... 74
(3) 指针....................................................................................................................... 74
5 运算符与表达式。..............................................................................................75
5.1 基本表达式 ...................................................................................................................78
5.2 后缀运算符 ...................................................................................................................78
用户手册 U14872CA1V0UM 11
(1) 下标运算符.............................................................................................................79
(2) 函数调用 ................................................................................................................80
(3) 结构体与共用体成员...............................................................................................81
(4) 后缀自增/自减运算符..............................................................................................83
5.3 单目运算符....................................................................................................................84
(1) 前缀自增/自减运算符..............................................................................................85
(2) 地址和间接运算符 ..................................................................................................86
(3) 单目算术运算符(+ – ~ !....................................................................................87
(4) sizeof 运算符..........................................................................................................88
5.4 类型转换运算符.............................................................................................................89
5.5 算术运算符....................................................................................................................90
(1) 乘性乘法运算符......................................................................................................91
(2) 加性加法运算符......................................................................................................92
5.6 按逐位移位运算符 .........................................................................................................93
5.7 关系运算符....................................................................................................................95
(1) 关系运算符.............................................................................................................96
(2) 等性运算符等式运算符 ...........................................................................................98
5.8 按位逻辑运算符.............................................................................................................99
(1) 按位与运算符 .......................................................................................................100
(2) 按位异或运算符....................................................................................................101
(3) 按位或运算符 .......................................................................................................102
5.9 逻辑运算符..................................................................................................................103
(1) 逻辑与运算符 .......................................................................................................104
(2) 逻辑或运算符 .......................................................................................................105
5.10 条件运算符..................................................................................................................106
5.11 赋值运算符..................................................................................................................107
(1) 简单赋值运算符....................................................................................................108
(2) 复合赋值运算符....................................................................................................109
5.12 逗号运算符..................................................................................................................110
5.13 常量表达式..................................................................................................................111
(1) 一般整型常量表达式.............................................................................................111
(2) 算术常量表达式....................................................................................................111
(3) 地址常量表达式....................................................................................................111
6 C语言的控制结构 ............................................................................................. 112
(1) 顺序处理 ..............................................................................................................112
(2) 条件控制(选择)处理.........................................................................................112
(3) 循环(迭代)处理................................................................................................112
(4) 分支处理 ..............................................................................................................112
6.1 带标号带标签的语句 ...................................................................................................114
(1) case标号case标签 ...............................................................................................115
(2) default标号default标签.........................................................................................117
6.2 复合语句(块)...........................................................................................................118
6.3 表达式语句和空语句 ...................................................................................................118
用户手册 U14872CA1V0UM 12
6.4 选择语句.....................................................................................................................119
(1) if if ... else 语句 ............................................................................................... 120
(2) switch语句........................................................................................................... 121
6.5 迭代语句.....................................................................................................................122
(1) while语句............................................................................................................. 123
(2) do语句................................................................................................................. 124
(3) for语句................................................................................................................. 125
6.6 分支语句.....................................................................................................................126
(1) goto语句.............................................................................................................. 127
(2) continue语句 ....................................................................................................... 128
(3) break语句 ............................................................................................................ 129
(4) return语句............................................................................................................ 130
7 结构体和共用体 ...............................................................................................131
7.1 结构体 ........................................................................................................................132
(1) 结构体和结构体变量的声明 ................................................................................. 132
(2) 结构体声明列表 ................................................................................................... 132
(3) 数组 和指针 ......................................................................................................... 133
(4) 如何引用结构体成员 ............................................................................................ 133
7.2 共用体 ........................................................................................................................134
(1) 共用体和共用体变量的声明 ................................................................................. 134
(2) 共用体结构体声明列表 ........................................................................................ 134
(3) 共用体数组和指针 ............................................................................................... 135
(4) 如何引用共用体成员 ............................................................................................ 135
8 外部定义 ..........................................................................................................137
8.1 函数定义.....................................................................................................................138
8.2 外部对象定义..............................................................................................................140
9 预处理指令(编译程序编译器指令)...............................................................141
9.1 条件包含.....................................................................................................................142
(1) #if指令 ................................................................................................................. 143
(2) #elif指令 .............................................................................................................. 144
(3) #ifdef指令 ............................................................................................................ 145
(4) #ifndef指令 .......................................................................................................... 146
(5) #else指令 ............................................................................................................ 147
(6) #endif指令 ........................................................................................................... 148
9.2 源文件包含 .................................................................................................................149
(1) #include < > 指令 ............................................................................................... 150
(2) #include “ ”指令 .................................................................................................. 151
(3) #include预处理记号字符串指令 ........................................................................... 152
9.3 宏替换 ........................................................................................................................153
(1) 实际参数替换....................................................................................................... 153
(2) # 操作符 .............................................................................................................. 153
用户手册 U14872CA1V0UM 13
(3) ## 操作符.............................................................................................................153
(4) 重扫描和再替换....................................................................................................154
(5) 宏定义的作用域....................................................................................................154
(6) #define指令..........................................................................................................155
(7) #define ( )指令 ....................................................................................................156
(8) #undef指令...........................................................................................................157
9.4 行控制 .........................................................................................................................158
(1) 更改行号 ..............................................................................................................158
(2) 更改行号和文件名 ................................................................................................158
(3) 用预处理程序记号字符串进行更改 .......................................................................158
9.5 #error预处理指令........................................................................................................159
9.6 #pragma指令..............................................................................................................160
9.7 空指令 .........................................................................................................................160
9.8 预定义的宏名 ..............................................................................................................161
10 库函数 ............................................................................................................ 163
10.1 函数之间的接口...........................................................................................................164
10.1.1 参数......................................................................................................................164
10.1.2 返回值..................................................................................................................165
10.1.3 保存个别单独库(Individual Libraries)所用的寄存器 .........................................165
(1) 未指定-ZR选项.....................................................................................................166
(2) 已指定-ZR选项.....................................................................................................167
10.2 头文件 .........................................................................................................................171
(1) ctype.h.................................................................................................................172
(2) setjmp.h...............................................................................................................173
(3) stdarg.h (仅正常模式)......................................................................................174
(4) stdio.h..................................................................................................................174
(5) stdlib.h .................................................................................................................175
(6) string.h.................................................................................................................177
(7) error.h..................................................................................................................178
(8) errno.h .................................................................................................................178
(9) limits.h..................................................................................................................178
(10) stddef.h ................................................................................................................180
(11) math.h (仅正常模式)........................................................................................181
(12) float.h...................................................................................................................183
(13) assert.h (仅正常模式) ......................................................................................185
10.3 可重入性(re-entrantability)(仅适用于正常模式) ...............................................185
(1) 不能重入不可重入的函数 .....................................................................................185
(2) 下列函数所使用的区域在启动例程中得到被特意保留保证的区域.........................185
(3) 处理浮点数的函数 ................................................................................................185
10.4 标准库函数..................................................................................................................186
10.5 更新启动例程及库函数的批处理文件 ..........................................................................296
10.5.1 使用批处理文件....................................................................................................297
用户手册 U14872CA1V0UM 14
11 章 扩展功能 .........................................................................................................300
11.1 宏名称 ........................................................................................................................301
11.2 关键字 ........................................................................................................................302
1 函数..................................................................................................................... 302
2 变量..................................................................................................................... 303
11.3 存储器 ........................................................................................................................304
1 存储模式.............................................................................................................. 304
2 寄存器组.............................................................................................................. 304
3 存储空间.............................................................................................................. 304
11.4 #pragma指令 .............................................................................................................306
11.5 如何使用扩展功能 ......................................................................................................308
(1) callt 函数 ............................................................................................................. 309
(2) 寄存器变量 .......................................................................................................... 312
(3) 如何使用saddrsaddr区域 ................................................................................. 316
(4) 如何使用sfrsfr区域 ........................................................................................... 323
(5) noauto函数 .......................................................................................................... 326
(6) norec 函数 ........................................................................................................... 330
(7) bit型变量.............................................................................................................. 335
(8) ASM 语句 ........................................................................................................... 339
(9) 中断函数.............................................................................................................. 342
(10) 中断函数修饰词(_ _ interrupt......................................................................... 349
(11) 中断函数.............................................................................................................. 351
(12) CPU控制指令 ...................................................................................................... 354
(13) 绝对地址访问函数 ............................................................................................... 356
(14) 位字段位域声明 .................................................................................................. 360
(15) 改变编译器输出区域块区段名称 ......................................................................... 368
(16) 二进制常量 ......................................................................................................... 379
(17) 模块名称改变函数 .............................................................................................. 381
(18) 循环移位函数...................................................................................................... 382
(19) 乘法函数............................................................................................................. 385
(20) 除法函数............................................................................................................. 387
(21) BCD 运算函数 .................................................................................................... 390
(22) 数据插入函数...................................................................................................... 394
(23) 静态模式............................................................................................................. 396
(24) 类型修改类型调整 .............................................................................................. 400
(25) Pascal 函数 ........................................................................................................ 402
(26) 函数调用接口的自动pascal功能化 ....................................................................... 405
(27) 参数/返回值的int展开限制方法 ............................................................................ 406
(28) 数组偏移量计算简化方法.................................................................................... 409
(29) 寄存器直接引用函数 ............................................................................................ 411
(30) 内存运算函数...................................................................................................... 415
(31) 绝对地址分配规范 .............................................................................................. 418
用户手册 U14872CA1V0UM 15
(32) 静态模式展开规范 ...............................................................................................422
(33) 临时变量 .............................................................................................................432
(34) 支持开端/结尾序言/结尾的库................................................................................435
11.6 C源代码的修改............................................................................................................444
11.7 函数调用接口 ..............................................................................................................445
11.7.1 返回值..................................................................................................................446
11.7.2 常用函数普通函数调用接口..................................................................................447
1 传输参数 ..............................................................................................................447
2 存储参数存储的位置和顺序..................................................................................448
3 存储自变量自动变量的位置和顺序 .......................................................................449
11.7.3 noauto 函数调用接口(仅在正常模式可用)........................................................454
1 传输递参数...........................................................................................................454
2 存储参数的位置和顺序.........................................................................................454
3 存储自变量自动变量的位置和顺序 .......................................................................455
11.7.4 norec函数调用接口(正常模式).........................................................................457
1 传输参数 ..............................................................................................................457
2 存储参数的位置和顺序.........................................................................................457
3 存储自变量自动变量的位置和顺序 .......................................................................458
11.7.5 静态模式函数调用接口 .........................................................................................460
1 传输参数 ..............................................................................................................460
2 存储参数的位置和顺序.........................................................................................460
3 存储自变量自动变量的位置和顺序 .......................................................................461
11.7.6 Pascal 函数调用接口 ...........................................................................................465
12 章 汇编程序的引用.............................................................................................469
12.1 访问参数/自动变量 ......................................................................................................470
12.1.1 普通模块普通模式 ................................................................................................470
12.1.2 静态模块静态模式 ................................................................................................473
12.2 返回值的存储 ..............................................................................................................475
12.3 C语言程序中调用汇编语言程序 ...............................................................................476
12.4 由汇编语言程序调用C语言程序...................................................................................480
1 由汇编语言程序调用C语言函数............................................................................480
2 引用在C语言函数中引用的参数............................................................................481
12.5 引用其它语言定义的变量 ............................................................................................482
1 引用C语言定义的变量 ..........................................................................................482
2 C语言程序引用汇编语言定义的变量 .................................................................483
12.6 注意事项 .....................................................................................................................484
1 ‘_’ ((下划线))....................................................................................................484
2 参数在堆栈中的位置.............................................................................................484
13 章 编译器的有效应用 ......................................................................................... 485
13.1 有效编码 .....................................................................................................................485
1 使用外部变量 .......................................................................................................486
用户手册 U14872CA1V0UM 16
2 1 位型数据........................................................................................................... 486
3 函数的定义 .......................................................................................................... 486
4 最优化选项 .......................................................................................................... 487
5 使用外部扩展描述 ............................................................................................... 487
附录A 用于saddr区域的标号标签列表 .........................................................................489
A.1 普通模块正常模式 ......................................................................................................489
A.2 静态模块模式..............................................................................................................491
附录B 段名列表 ............................................................................................................492
<1> CSEG 再定位重定位段属性................................................................................. 492
<2> DSEG 再定位重定位属性 .................................................................................... 492
B.1 段名列表.....................................................................................................................493
B.2 段定位 ........................................................................................................................ 493
B.3 C 源程序示例..............................................................................................................494
B.4 输出汇编模块示例 ...................................................................................................... 495
附录C 运行时库运行时刻库列表 ...................................................................................499
附录D 堆栈耗用空间列表..............................................................................................505
附录E 索引 ...................................................................................................................514
用户手册 U14872CA1V0UM 17
插图列表
插图编号 插图标题 ....................................................................................................................页码
1-1 编译流程 .....................................................................................................................................................22
1-2 使用该C编译器进行程序开发的过程 ............................................................................................................24
4-1 通常算术类型转换.......................................................................................................................................73
6-1 选择语句的控制流程 .................................................................................................................................119
6-2 迭代语句的控制流程 .................................................................................................................................122
6-3 分支语句的控制流程 .................................................................................................................................126
10-1 函数被调用时的栈区(未指定-ZR.......................................................................................................167
10-2 格式命令的语法 ......................................................................................................................................198
10-3 输入格式命令的语法 ...............................................................................................................................202
11-1. 通过位字段位域声明的位分配(示例 1..............................................................................................362
11-2. 通过位字段位域声明进行位分配(示例 2...........................................................................................363
11-3. 通过位字段位域声明分配位(示例 3..................................................................................................365
12-1. 调用后的堆栈区 .....................................................................................................................................476
12-2. 返回后的堆栈区 .....................................................................................................................................479
12-3. 参数入栈................................................................................................................................................480
12-4. 传递参数至C 语言程序 ..........................................................................................................................481
12-5. 参数在堆栈中的位置..............................................................................................................................484
用户手册 U14872CA1V0UM 18
表格列表
表格编号 表格标题.....................................................................................................................页码
1-1 C编译器的性能指标最大值(1/2.........................................................................................................28
1-1 使用该C编译器的最低性能指标(2/2.......................................................................................................29
2-1 转义字符序列列表 ......................................................................................................................................36
2-2 三字符序列列表 ..........................................................................................................................................36
2-3 基本数据类型列表 ......................................................................................................................................44
2-4 指数关系.....................................................................................................................................................45
2-5 运算异常列表..............................................................................................................................................46
4-1 类型转换列表..............................................................................................................................................71
4-2 从带符号有符号整型向无符号整型之间的转换............................................................................................72
5-1 运算符计算优先级 ......................................................................................................................................77
5-2 除号/求余运算结果符号 ..............................................................................................................................90
5-3 移位运算.....................................................................................................................................................93
5-4 按位与运算符 ...........................................................................................................................................100
5-5 按位异或运算符........................................................................................................................................101
5-6 按位或运算符 ...........................................................................................................................................102
5-7 逻辑与运算符 ...........................................................................................................................................104
5-8 逻辑或运算符 ...........................................................................................................................................105
10-1 第一参数传递列表(正常模式) .............................................................................................................164
10-2 参数传递列表(静态模式) ....................................................................................................................165
10-3 返回值存储列表 ......................................................................................................................................165
10-4 ctype.h的内容 .........................................................................................................................................172
10-5 setjmp.h的内容 .......................................................................................................................................173
10-6 stdarg.h的内容 .......................................................................................................................................174
10-7 stdio.h的内容 ..........................................................................................................................................174
10-8 stdlib.h的内容 .........................................................................................................................................175
10-9 string.h的内容.........................................................................................................................................177
10-10 math.h的内容 (1/2) ...............................................................................................................................181
10-10 math.h的内容 (2/2) ...............................................................................................................................182
10-11 assert.h的内容 ......................................................................................................................................185
10-12 更新库函数的批处理文件 ......................................................................................................................296
11-1. 添加的关键字列表 ..................................................................................................................................302
11-2. 存储空间的利用 ......................................................................................................................................305
11-3. #pragma指令列表 ...................................................................................................................................307
11-4. 指定-QL选项时可以使用的callt 属性函数的数量 ....................................................................................310
11-5. callt函数用途用法的限制........................................................................................................................310
11-6. 使用寄存器变量使用方法的限制 .............................................................................................................313
11-7. 使用sreg变量使用方法的限制 ................................................................................................................317
11-8. 通过-RD选项分配到saddrsaddr区域的变量 .......................................................................................319
11-9. 通过-RS选项分配到saddrsaddr区域的变量........................................................................................320
11-10. 通过-RK选项分配到saddrsaddr区域的变量......................................................................................321
11-11. 仅使用常数 0 1 的运算符号操作符(通过Bit型变量)......................................................................336
11-12. 当使用中断函数时保存/恢复区..............................................................................................................343
11-13. 类型修改类型调整的详细信息(从intshort型改为char型) ..............................................................400
11-14. 类型修改类型调整的详细内容(从long型改为int型) ...........................................................................401
表 11-15. 保存所针对的中断函数 存储目标 .........................................................................................................422
用户手册 U14872CA1V0UM 19
11-16. 存储返回值的位置 ................................................................................................................................446
11-17. 其中第一个参数传输入的位置(函数调用端方) .................................................................................447
11-18. 静态模式下传输参数的区 .....................................................................................................................460
表 12-1. 参数传递 ((函数调用方))....................................................................................................................470
表 12-2. 参数/自动变量的存储 ((被调用函数内)) .............................................................................................471
表 12-3. 参数传递 ((函数调用方))....................................................................................................................473
表 12-4. 参数/自动变量存储 ((被调用函数内)).................................................................................................473
12-5. 返回值存储单元存储位置.......................................................................................................................475
C-1. 运行时库运行时刻库列表 (1/6)................................................................................................................499
C-1. 运行时库运行时刻库列表 (2/6)................................................................................................................500
C-1. 运行时库运行时刻库列表 (3/6)................................................................................................................501
C-1. 运行时库运行时刻库列表 (4/6)................................................................................................................502
C-1. 运行时库运行时刻库列表 (5/6)................................................................................................................503
C-1. 运行时库运行时刻库列表 (6/6)................................................................................................................504
D-1. 标准库堆栈耗用列表 (1/4) .......................................................................................................................505
D-1. 标准库堆栈耗用空间列表 (2/4)................................................................................................................506
D-1. 标准库堆栈耗用空间列表 (3/4)................................................................................................................507
D-1. 标准库堆栈耗用空间列表 (4/4)................................................................................................................508
D-2. 运行时库运行时刻库堆栈耗用空间列表(1/5)............................................................................................509
D-2. 运行时库运行时刻库堆栈耗用空间列表(2/5)............................................................................................510
D-2. 运行时库运行时刻库堆栈耗用空间列表(3/5)............................................................................................511
D-2. 运行时库运行时刻库堆栈耗用空间列表(4/5)............................................................................................512
D-2. 运行时库运行时刻库堆栈耗用空间列表(5/5)............................................................................................513
用户手册 U14872CA1V0UM 20

第 1 章 概述

CC78K0S 系列 C 编译器是一款语言处理程序,不论编写的 C 语言源程序符合 78K/0S 系列规范或是符合 ANSI-C 规 范,CC78K0S 系列 C 编译器都会将 C 语言转换为机器语言。使用 CC78K0S 系列 C 编译器还将获得适用于 78K/0S 系 列单片机的目标文件或汇编源文件。

1.1 C 语言与汇编语言

为了让微控制器按照用户的安排来完成工作,程序和数据是必不可少的。程序和数据必须由人(程序员)来编写,并 存储在微控制器的存储器区。微处理器能够处理的程序和数据,只不过是被称为机器语言的二进制数组合而已。
汇编语言是一种符号语言,其特征是符号(助记符)语句与机器语言指令一一对应。正是由于这种一一对应,汇编语 言才能够为计算机提供详细的指令(例如,为了提升 I/O 处理速度)。但是,这意味着程序员必须对计算机的每一步操 作都给出具体指令。正是由于这种原因,程序的逻辑结构比较复杂,一般都比较晦涩难懂,而且程序员在编写代码时也 容易出错。
所以,人们开发了高级语言来代替这种汇编语言。C 语言是高级语言的其中一种,它使得程序员在编程时无需考虑计 算机的体系结构。
与汇编语言程序相比,可以认为 C 语言编写开发的程序逻辑结构更加易于理解。
C 语言具有丰富的调用函数,可用来开发程序。换句话说,程序员可以使用这些函数来编写程序。
C 语言的特点是便于人们理解。但是,C 语言编写的程序无法被微处理器直接理解。所以,要使计算机理解 C 语言
程序,需要另外一个软件程序将 C 语言语句翻译成对应的机器语言指令。把 C 语言翻译成机器语言的程序被称为 C 编 译器。
C 编译器的输入是 C 源程序模块,并产生目标模块或汇编语言源程序模块作为输出文件。因此,如果程序员希望能 够指定计算机的程序执行具体过程,可以对 C 源程序生成的汇编语言源程序进行修改。C 编译器的转换流程如图 1-1 所 示。
用户手册 U14872CA1V0UM 21
1 章 概述
1-1 编译流程
用户手册 U14872CA1V0UM 22
1 章 概述

1.2 使用 C 编译器的程序开发过程

使用 C 编译器进行产品(程序)开发,需要连接器来组织编译器生成的目标模块文件,需要库管理程序来创建库文 件,需要调试器来查找并纠正每个 C 源程序中的 bug(错误或失误)。
和该 C 编译器有关的软件如下。
编辑器 .........................................用于创建源程序模块文件
• RA78K0S 汇编程序包
汇编器 .........................................用于将汇编语言转换为机器语言
连接器 .........................................用于连接目标模块文件
以确定为重定位代码段分配的地址
目标转换器..................................用于转换生成十六进制格式的目标模块文件
库管理程序..................................用于创建库文件
调试器(用于 78K/0S) ..............用于调试 C 源程序模块文件
使用 C 编译器进行程序开发的步骤如下。
<1> 将程序划分成若干个功能块。
<2> 创建每个功能块对应的 C 源程序模块。
<3> 对每个 C 源程序模块进行转换。
<4> 将常用的模块注册到库中。
<5> 连接相应的目标模块文件
<6> 对每个模块进行调试。
<7> 将目标模块转换成十六进制格式的目标文件。
如上所述,该 C 编译器对 C 源程序模块进行翻译(编译),生成目标模块文件或汇编语言源程序模块文件。对生成 的汇编语言源程序模块文件进行手工优化,并将其嵌入到 C 源程序中,可以产生效率更高的目标模块。这种处理方法对 于必须执行高速处理,或模块必须非常紧凑的情况很有用。
用户手册 U14872CA1V0UM 23
1 章 概述
1-2 使用该 C 编译器进行程序开发的过程
C ⑤⿟ᑣ
㒧ᵘ࣪∛㓪 ⑤⿟ᑣ
༈᭛ӊ
∛㓪⑤⿟ᑣ
∛㓪߫㸼
߫㸼䕀ᤶ఼
㒧ᵘ࣪∛㓪఼
∛㓪఼
䖲᥹఼
῵ഫ䕀ᤶ఼
C 㓪䆥఼
∛㓪⿟ᑣ
MX78K0S
Ⳃ󰵼῵ഫ᭛ӊ ᑧ᭛ӊ
ᑧㅵ⧚⿟ᑣ
ᑧ᭛ӊ
㺙䕑῵ഫ᭛ӊ
㋏㒳 ῵ᢳ఼
䲚៤࣪⹀ӊ䇗䆩఼
㒱ᇍ∛㓪 ߫㸼
HexḐᓣ Ⳃ󰵼
PROM 㓪⿟఼
用户手册 U14872CA1V0UM 24
RS-232C
IN CIRCUIT EMULATOR
POWER
ϧ⫼ᑊ㸠᥹ষ
೼㒓ӓⳳ఼
1 章 概述

1.3 C 源程序的基本结构

1.3.1 程序格式

C 程序是函数的集合。这些函数必须创建,因为每一个都有独立的特殊用途或者特征动作。所有 C 语言程序都必须 有一个 main 函数,main 函数是 C 语言中的入口主程序,并且是程序开始执行时被调用的第一个函数。
每个函数由两部分组成,一部分是函数头部用于定义函数名称和参数,另一部分是函数体包括声明和语句。C 程序的 格式如下所示。
变量/常量的定义
main (参数)
{ 语句 1 语句 2 函数 1 (参数) 函数 2 (参数)
} 函数 1 (参数)
{
语句 1 语句 2
} 函数 2 (变量)
{ 语句 1 语句 2
}
定义每个数据、变量和宏指令
main 函数的首部
main 函数体
函数 1
函数 2
用户手册 U14872CA1V0UM 25
1 章 概述
一个实际的 C 源程序示例。
#define TRUE 1 #define FALSE 0
#define xxx xxx .............................预处理程序指令(定义宏) <6>
#define SIZE 200
void printf(char *,int);
xxx xxxx (xxx, xxx) ...........................................函数原型声明符 <7>
void putchar(char);
char mark[SIZE+1]; main()
char xxx .....................类型声明符 <1> 外部定义 <5>
xx [xx].............................................................................操作符 <2>
{ int i,prime,k,count;
int xxx .....................................................................类型声明符 <1>
count=0;
xx = xx............................................................................ 操作符 <2>
for(i=0;i<=SIZE;i++)
for (xx;xx;xx) xxx ; ...................................................... 控制结构 <3>
mark[i]=TRUE;
for(i=0;i<=SIZE;i++){ if(mark[i]){ prime=i+i+3; printf("%6d",prime);
xxx = xxx + xxx + xxx .................................................. 操作符 <2>
xxx (xxx) ; .................................................................... 操作符 <2>
count++; if((count%8)==0) putchar('\n');
if (xxx) xxx ; ................................... 控制结构 <3>
for(k=i+prime;k<=SIZE;k+=prime) mark[k]=FALSE; } } printf("\n%d primes found.",count);
xxx (xxx) ;........................................... 操作符 <2>
}
void printf(char *s,int i) { int j; char *ss;
j=i; ss=s; }
void putchar(char c) { char d; d=c; }
用户手册 U14872CA1V0UM 26
1 章 概述
<1> 类型与存储类的声明
标识符的数据类型与存储类表明声明了对应的数据目标。具体细节敬请参阅3 章 类型与存储类的声明
<2> 操作符与表达式
它们是指示编译器运算的语句,比如算术运算、逻辑运算或赋值运算。具体细节敬请参阅5 章 运算符与表达
<3> 控制结构 这是语句用来规定程序流程。C 语言有多个指令用于控制结构,如条件控制、迭代和分支跳转。具体细节敬请
参阅6 C 语言的控制结构 <4> 结构体或共用体 声明一个结构体或共用体。结构体是包括多个不同类型子目标或成员的数据目标。当两个或多个变量共用相同
的内存时,可以定义为一个共用体。具体细节敬请参阅7 结构体与共用体 <5> 外部定义 声明一个函数或外部目标。当 C 语言源程序被划分为多个独立的特殊用途或特征动作时,函数就是一个元素,
C 源程序就是这些函数的集合。 具体细节敬请参阅8 章 外部定义 <6> 预处理指令 这是编译器专有的的指令。当源程序中出现对应参数时,#define 指令通知编译器将与第一个操作数相同的参
数替换为第二个操作数。具体细节敬请参阅9 预处理指令(编译器指令) <7> 函数原型声明 声明一个函数的返回值和参数类型。
用户手册 U14872CA1V0UM 27
1 章 概述

1.4 程序开发前的提示

在进行程序开发工作之前,请牢记在以下表 1-1 中总结的要点(限制值或最大保证值)。
1-1 C 编译器的性能指标最大值(1/2
编号 项目
复合语句、循环语句或条件控制语句的嵌套层数 45
1
条件转移的嵌套层数 255
2
在一个声明语句中,算术类型、结构体类型、仅用于共用体类型或不完
3
全类型的指针、数组和函数(或这些项的任意组合)声明符的数量
每个表达式中的括号嵌套层数 32
4
用作宏名称的字符数量 256 字符
5
用作内部或外部符号名称的字符数量 249 字符
6
每个源程序模块文件的符号数量
7
一个块中具有块作用域的符号的数量(块的嵌套层数)
8
每个源程序模块文件的宏的数量
9
每个函数定义或函数调用中的参数数量 39 个参数
10
每个宏定义或宏调用中的参数数量 31 个参数
11
每个源代码逻辑行的字符数量 2048 字符
12
连接后一个字符串内的字符数量 509 字符
13
一个数据目标的大小 65535 字节
14
#include 指令的嵌套层数 8
15
每个 switch 语句中 case 标签数量 257 个标签
16
每个转换单元的源代码行数 大约 30000
17
无需创建临时文件就能完成翻译的源代码行数 大约 300
18
函数调用的嵌套层数 40
19
每个函数中的标签数量 33 个标签
20
1. 当符号可以使用现有的内存空间进行处理而不需要使用任何临时文件时,以上的各项数值为最大值。当由于
内存空间不足而使用临时文件时,必须根据文件大小对该值进行更改。
2. 该值包括 C 编译器保留的宏定义。
限制值/最大保证值
12
1024 个符号
255 个符号
10000 个宏
1
1
2
用户手册 U14872CA1V0UM 28
1 章 概述
1-1 使用该 C 编译器的最低性能指标(2/2
编号 项目
每个目标模块的代码、数据及栈段的总大小 65535 字节
21
每个结构体或共用体的成员数量 256 个成员
22
每个枚举类型中 enum 常量的数量 255 个常量
23
一个结构体或共用体中包含结构体或共用体的嵌套层数 15
24
初始化时元素的嵌套层数 15
25
每个源程序模块文件中定义的函数数量
26
一个完整的声明符中,括号内的声明符嵌套层数
27
宏的嵌套层数
28
-I 选项指定包含文件的路径数量
29
限制值/最低保证值
1,000
591
200
64
用户手册 U14872CA1V0UM 29
1 章 概述

1.5 C 编译器的特色

C 编译器支持用于指导 CPU 代码生成的扩展函数,这些扩展函数是 ANSI(美国国家标准协会)C 不支持的。C
编译器的扩展函数使得 78K/0S 系列的特殊功能寄存器(SFR)能在 C 语言中进行描述,从而缩短了目标代码,并改善 了程序执行速度。关于这些扩展函数的详细情况,请参阅本手册11 章 扩展函数
下面概括介绍这些用于缩短目标代码并改善执行速度的扩展函数。
函数可以使用 callt 表区域进行调用................................................................... callt /_ _callt 函数
变量可以分配到寄存器中 ................................................................................... 寄存器变量
变量可以分配到 saddr 区域中........................................................................... sreg/_ _sreg
可以使用特殊功能寄存器名称............................................................................ sfr 区域
可以创建不输出堆栈帧信息的函数 .................................................................... noauto 函数,
norec/_ _leaf 函数
在 C 源程序中可以进行汇编语言程序的描述 .................................................... . ASM 语句
可以按位访问 saddr sfr 区域........................................................................ bit 型变量,
boolean/_ _boolean 型变量
可以用无符号字符型指定位域 ........................................................................... 位域声明
乘法代码可以使用内联展开直接输出 ................................................................. 乘法函数
除法代码可以使用内联展开直接输出 ................................................................. 除法函数
移位代码可以使用内联展开直接输出 ................................................................. 移位函数
可以访问内存空间中的特定地址 ........................................................................ 绝对地址函数
特定的数据和指令可以直接嵌入到代码区域中................................................... 插入数据函数
使用的栈在被调用函数方进行校正 .................................................................... _ _pascal 函数
下面概括介绍该编译器的扩展函数。关于每个扩展函数的详细情况,请参阅第 11 章。
(1) callt/_ _callt 函数
函数可以使用 callt 表区域进行调用。每个待调用的函数(该函数称为 callt 函数)地址存储在 callt 表中,供以后 调用。这使得目标代码比使用通常的调用指令 call 的目标代码要短。
(2) 寄存器变量
使用寄存器存储说明符进行声明的变量被分配到寄存器或 saddr 区域。分配到寄存器或 saddr 区域的变量,其相 关指令比那些分配到内存的变量使用的指令在代码长度上要更短。这样有助于缩短目标代码和改善程序执行速度。
(3) saddr 区域的使用
使用关键字 sreg 声明的变量可以分配到 saddr 区域。sreg 变量的相关指令比分配到内存的那些变量的指令在代 码长度上要短。这有助于缩短目标代码和改进程序执行速度。还可以根据选项将对应类型的变量分配到 saddr 区 域。
(4) sfr 区域
通过声明使用 sfr 名称,可以在 C 源文件中对 sfr 区域进行操作。
用户手册 U14872CA1V0UM 30
1 章 概述
(5) noauto 函数
被声明为 noauto 的函数不输出代码的预处理和后处理(堆栈帧信息)过程。通过调用 noauto 函数可以用寄存器 传递参数。这样有助于缩短目标代码和改进程序执行速度。该函数对参数/自动变量加以限制。详细情况,请参阅 第 11.5 (5) noauto 函数。
(6) norec/_ _leaf 函数
被声明为 norec/_ _leaf 的函数不输出代码的预处理和后处理(堆栈帧信息)。通过调用 norec/_ _leaf 函数,参 数将尽可能经过寄存器进行传递。norec/_ _leaf 函数内使用的自动变量被分配给寄存器或 saddr·区域。这有助于 缩短目标代码和改进程序执行速度。该函数对参数/自动变量加以限制,并且不允许调用其他函数。详细情况,请 参阅第 11.5 (6) norec 函数。
(7) 位型变量与 boolean/_ _boolean 型变量
产生占用 1 位存储区的变量。使用位型变量或 boolean/_ _boolean 型变量,可以按位访问 saddr 区域。
boolean/_ _boolean 型变量与位型变量的功能和用法相同。
(8) ASM 语句
用户编写的汇编源程序可以嵌入到该 C 编译器输出的汇编源文件中。
(9) 中断函数
预处理指令输出一个向量表,并输出与中断对应的目标代码。该指令允许在 C 源代码级别上对中断函数进行编程。
(10) 中断函数修饰符
该修饰符允许设置一个向量表,并允许定义在另一个文件中描述中断函数。
(11) 中断函数
将中断禁止指令和中断使能指令嵌入到目标代码中。
(12) CPU 控制指令
以下指令都要嵌入到目标代码中: halt 的值设置给 STBC 寄存器的指令 stop 的值设置给 STBC 寄存器的指令 nop 指令
(13) 绝对地址访问函数
访问普通存储空间的代码通过直接内联展开进行创建,无需借助于函数调用,并创建一个目标文件。
(14) 位域声明
将位域指定为无符号字符型,可以节省内存,缩短目标代码,并提高执行速度。
用户手册 U14872CA1V0UM 31
1 章 概述
(15) 更改编译器输出区名称的函数
通过更改编译器输出区名称,被改名的段就可以脱离连接器进行独立地分配。
(16) 二进制常量描述函数
可以在 C 源代码中描述二进制常量。
(17) 模块名更改函数
可以在 C 源代码中自由地更改目标模块名称。
(18) 循环移位函数
将表达式的值循环移位的代码可以在目标文件中用内联展开直接输出。
(19) 乘法函数
将计算乘法表达式的值的代码用内联展开直接输出。该函数可以缩短目标代码,并改进执行速度。
(20) 除法函数
将计算除法表达式的值的代码用内联展开直接输出。该函数可以缩短目标代码,并改进执行速度。
(21) BCD 操作函数
该函数将目标操作值的 BCD 调整操作代码使用直接内联展开直接输出到目标文件。BCD 操作是指将十进制数的每 位数字转换为 4 位二进制数加以存储。
(22) 数据插入函数
常量数据被插入到指定地址中。可以不用汇编语言就将特殊数据和指令嵌入到代码区。
(23) 静态模式
在编译过程中指定 -SM 选项,可以缩短目标代码,改进执行速度,实现高速中断处理,并节省内存空间。
(24) 类型更改
通过指定 -ZI 选项和 -ZL 选项,int/short 型将被视为 char 型,long 型将被视为 int 型。
(25) Pascal 函数(_ _pascal
用于在函数调用时放置参数的堆栈调整工作在被调用函数方执行,而不是在函数调用方执行。当此类函数调用大量 出现时,能够缩短目标代码。
(26) 函数调用接口的自动 pascal 函数化
在编译过程中指定 -ZR 选项,除了 norec__interrupt 及参数长度可变的函数之外,其他函数全都会增加 __pascal 属性。
用户手册 U14872CA1V0UM 32
1 章 概述
(27) 参数/返回值的 int 扩展限制方法
编译过程中指定 -ZB 选项,可以缩短目标代码,并提高执行速度。
(28) 数组偏移量计算简化方法
编译过程中指定 -QW2-QW3、-QW4-QW5 选项,可以简化偏移量计算代码,缩短目标代码,并提高执行速 度。
(29) 寄存器直接引用函数
在源程序中编写调用该函数的代码,调用方式和函数调用相同,或者在模块中使用 #pragma realregister 指令声 明都可以使用寄存器直接引用函数,就可以通过 C 规范轻松实现对寄存器的访问。
(30) 内存操作函数
使用 #pragma 内联指令,可以使用内联展开(而非函数调用)来输出标准库函数 memcpymemset,从而生成 一个目标文件。该函数可以改进执行速度。
(31) 绝对地址分配规范
通过在模块中声明 __directmap,可以为任意地址分配一个或多个变量,在该模块定义待分配到绝对地址的变量。
(32) 静态模式展开规范
编译过程中指定 -ZM 选项,可以放松对现有静态模式的限制,从而改进描述性能。
(33) 临时变量
编译过程中指定 -SM-ZM 选项,并将参数和自动变量声明为 _ _temp ,则可以保留一个存储区用来存储参数和 自动变量。 此外,如果包含参数和自动变量的区域被明确定义的话,且对那些在函数调用前后无须保证值匹配的变量加
__temp 声明,则可以保留内存。
(34) 支持序言/尾声的库
编译过程中指定 -ZD 选项,可以用库代替序言/尾声代码,从而缩短目标代码。
用户手册 U14872CA1V0UM 33

2 C 语言的结构

本章介绍 C 源程序模块文件的构成要素。 一个 C 源程序模块文件由以下标记(字符序列中可以辨别出来的单元)构成。
关键字 标识符 常数量 字符串文字 运算符 定界符 头文件名 预处理的编号 注释
下面举例介绍在 C 程序中使用的标记。
#include “expand.h” extern void testb(void);
extern void chgb(void); extern bit data1; extern bit data2;
void main() { data1=1; data2=0;
while(data1){ data1=data2; testb(); } if(data1&&data2){ chgb(); } }
void lprintf(char *s,int i) { int j; char *ss; j=i; ss=s;
} . . .
extern............................................................ 关键字
data1, data2.................................................. 标识符
void ............................................................... 关键字
1.................................................................... 常数
0.................................................................... 常数
while.............................................................. 关键字
{ } ................................................................. 定界符
=.................................................................... 运算符
if .................................................................... 关键字
&& ................................................................. 运算符
( ) ................................................................. 运算符
lprintf ............................................................. 标识符
char, int ......................................................... 关键字
s, i ................................................................. 标识符
* .................................................................... 运算符
34
用户手册 U14872CA1V0UM
2 C 语言的结构

2.1 字符集

(1) 字符集
C 程序中使用的字符集包括用于描述源文件的源字符集,和在执行环境下进行解释的执行字符集。 执行字符集中每个字符的值由 JIS 代码表示。 以下字符可以同时在源字符集和执行字符集中同时使用:
26 大写字母
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
26 小写字母
a b c d e f g h i j k l m n o p q r s t u v w x y z
10 十进制数
0 1 2 3 4 5 6 7 8 9
29 图形字符
! “ # % & ‘ ( ) * + , - . / : ; < = > ? [ \ ] ^ — { | } ~
以及用于指示空格、横向制表、垂直制表、换页等的非打印控制字符。(请参阅下文中的转义字符序列。)
备注 在字符常量中,字符串文字、注释语句中,可能会使用以及上述字符以外的字符都可以使用。
用户手册 U14872CA1V0UM
35
2 C 语言的结构
(2) 转义字符序列
转义字符序列可以用来表示用作控制字符,比如用于提示报警或、换页符等的非图形字符由转义字符序列来表示。 每个转义字符序列都由 \ 符号和一个字母字符组成。 由转义字符序列表示的非图形字符如下表所示。
2-1 转义字符序列列表
转义字符序列 含义 字符代码
\a
\b
\f
\n
\r
\t
\v
警示
退格
换页
换行
回车
水平制表
垂直制表
07H
08H
0CH
0AH
0DH
09H
0BH
(3) 三字符序列
当源文件中包含下表中左列中列出的三字符时(称为三字符序列),这些列出的三字符将被转换为在右列中列出 的单个字符。
2-2 三字符序列列表
三字符序列 含义
??= #
??( [
??/ \
??) ]
??’ ^
??< {
??! |
??> }
??- ~
36
用户手册 U14872CA1V0UM
2 C 语言的结构

2.2 关键字

(1) ANSI-C 关键字
以下标记在本 C 编译程序 C 编译器中用作关键字,因此不可用作标号标签或变量名。
auto break case char const continue default do double else enum extern for float goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while
(2) CC78K0S 增加的关键字
在本 C 编译程序 C 编译器中,增加了以下标记作为关键字,来实施其扩展的功能。(当包含大写字母时,此标记 将不被视为关键字) 这些标记不可用作标号标签或变量名,ANSI C 对这些标记不兼容。也不可以(当包含大写字 母时,标记将不被视为关键字)。 不是以“_ _”开始的关键字可以通过指定(-ZA)选项使其失效,(-ZA)选项仅允许 ANSI-C 语言规范。 callf, _ _callf、_ _banked 1 ~ 15、 _ _rtos_interrupt 及 _ _interrupt_brk 是用作关键字的标记,以便与 CC78K0 兼 容。
_ _callt/callt........................................... 声明 callt 函数
_ _callf/callf........................................... 声明 callf 函数
_ _sreg/sreg .......................................... 声明 sreg 变量
noauto ................................................... 声明 noauto 函数
_ _leaf/norec ......................................... 声明 norec 函数
bit........................................................... 声明
_ _boolean/boolean.............................. 声明 布尔 型变量
_ _interrupt............................................ 硬件中断函数
_ _interrupt_brk .................................... 软件中断函数
_ _banked 1 to 15 ................................. Bank 函数功能
_ _asm................................................... asm 汇编语句
_ _rtos_interrupt................................... RTOS 中断处理程序
_ _pascal ............................................... Pascal 函数
_ _directmap ......................................... 绝对地址分配规范
_ _temp .................................................. 临时变量
_ _mxcall ............................................... _ _mxcall 函数
用于与 MX 接口的保留关键字。用户不能使用该关键字。
型变量
用户手册 U14872CA1V0UM
37
2 C 语言的结构

2.3 标识符

标识符是用于以下变量的名称:
函数 对象 结构体标记、共用体标记或枚举型标记 结构体成员、共用体成员或枚举型成员 typedef 名称 标号标签名称 宏名称 宏参数
每个标识符都可以由大写字母、小写字母、数值字符和下划线组合而成组成。 以下字符可以用作标识符。
标识符的最大长度没有限制。 不过,在本编译程序器中,只能识别前 249 个字符(请参阅表 1-1 该编译器 的最高 性能指标(本编译程序))。
_(下划线) a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
所有的标识符都必须以非数值字符开始(即,以字母或下划线开始),且不得与任何关键字相同重名。
38
用户手册 U14872CA1V0UM
2 C 语言的结构

2.3.1 标识符的作用域范围

标识符的有效作用域取决于标识符声明的位置。 标识符的作用域分为以下四种类型。
函数作用域
文件作用域
块作用域
函数原型作用域
extern __boolean data1, data2; void testb (int x);
data1, data2..................................................... 文件作用域
x............................................... 函数原型作用域
void main(void) { int cot;
cot................................................................. 块作用域
data1=1; data2=0;
while(data1){ data1=data2; j1:
j1............................................................. 函数作用域
testb(cot); } } void testb(int x)
x.................................................................... 块作用域
{ . . .
(1) 函数作用域
函数作用域指的是函数内的所有位置整体。 具有函数作用域的标识符可以从指定的函数内的任何地方进行引用。 具有函数作用域的标识符只有标签名称标号名。
(2) 文件作用域
文件作用域指翻译(编译)单元内的整体。 在块的外部或参数列表之外声明的标识符的有效范围为均具有文件作 用域。 具有文件作用域的标识符可以在程序内的任何地方引用。
用户手册 U14872CA1V0UM
39
2 C 语言的结构
(3) 块作用域
块作用域指一个块的范围(由一对花括号括起来的声明和语句序列,开始于左括号,结束于右括号)。 在块或参数列表内声明的标识符均具有块作用域。 具有块作用域的标识符的有效范围是从定义位置直到包含标识 符声明最内层的一对括号闭合为止。
(4) 函数原型作用域
函数原型作用域是指一个声明的函数从头至尾的范围。 在函数原型内的参数列表中声明的所有标识符均都具有函 数原型作用域。 具有函数原型作用域的标识符在指定的函数内均有效。

2.3.2 标识符的连接

标识符的连接是指标识符可以作为相同的对象或函数来引用,要求是,在不同作用域声明一次以上的同一标识符,或 在同一作用域声明一次以上的同一标识符标识符可以作为相同的对象或函数来引用。 通过相互连接,多个标识符可以被 视为同一个标识符。 可以使用以下三种不同的方法将标识符连接起来:外部连接、内部连接和无连接。
(1) 外部连接
外部连接是指作为标识符以构成整个程序并作为一个库文件集合的翻译(编译)单元进行连接的标识符,标识符构 成了整个程序,并组成一系列的库的集合。 下面给出了具有外部连接的标识符示例:
已经声明却的未指定有存储类规范型的函数的标识符
已经声明为 extern 却未指定存储类型、且未有存储类规范的对象或函数的标识符
具有文件作用域却未指定存储类型但未有存储类规范的对象标识符
(2) 内部连接
内部连接是指标识符在一个翻译(编译)单元内将要进行的连接的标识符。 下面给出了具有内部连接的标识符示例:
具有文件作用域且包含指定存储类型为说明符 static 的对象或函数的标识符
(3) 无连接
与其他标识符没有任何连接的标识符,本身就是是一个固有实体。 没有连接的标识符示例如下:
不引用数据对象或函数的标识符
被声明为函数参数的标识符
在块内没有未指定存储类型说明符 extern 的对象的标识符
40
用户手册 U14872CA1V0UM
2 C 语言的结构

2.3.3 标识符名字空间

所有的标识符可以分为归入以下的名字空间”。
标号标签名 ......................................................... 由一个标签标号声明来标识
结构体、共用体或枚举的标记名 ......................... 由关键字 struct,union enum 来标识
结构体或共用体的成员名 ................................... 由点(.)运算符或箭头(->)运算符来标识。
普通标识符(上述标识符情况以外的标识符) ... 声明为普通标识符或枚举型常量

2.3.4 对象的存储时间

每个对象都有一个决定其生存期的存储时间(它在内存中存在的时间)。存储时间分为以下两类:静态存储时间和自
动存储时间。
(1) 静态存储时间
在执行具有静态时间存储的目标程序前,为存储的对象和值保留一个区域,并下来用于存储对象和值的存储区将被 进行初始化一次。 存在于在整个程序的执行过程中都持续存在并保持最后存储的其值的对象将最后存储。 具有静态存储时间生命期的对象如下所示。
具有外部连接的对象
具有内部连接的对象
由存储类别修饰符 static 声明的对象
(2) 自动存储时间
对于具有自动存储时间的对象,当这些对象进入他们被一个待声明的程序块时,将为其保留一个存储区区域。 如果规定了初始化,当这些对象从进入程序块的开头进入时处要进行初始化。 在这种情况下,如果有任何对象进 入程序块的方式是从外部跳转到跳到程序块内的一个标签标号而进入程序块时,则该对象将不进行初始化。 对于具有自动存储时间周期的对象,当执行完毕声明的程序块执行完毕时,保留的存储区区域将无法得不到保证。 具有自动存储时间生命期的对象如下所示。
不具有无连接的对象
在程序块内声明,但而没有加存储类修饰符 static 的对象

2.3.5 数据类型

数据类型决定存储在各个对象中的值的含义,分为以下三类。
对象类型 ...................................................... 指表示一个具有大小信息的对象的类型
函数类型 ...................................................... 表指示一个函数的类型
不完全类型 ................................................... 表指示一个不具有大小信息的对象的类型
这些类型的分类如下所示。
用户手册 U14872CA1V0UM
41
2 C 语言的结构
基本类型 整型 char 字符 (算术类型) 有符号 有符号字符型 signed char 整型 短整 short int 整型 int 长整型 long int 无符号整型 (由 unsigned 指定) 枚举型 浮点型 float 浮点型 double 双精度型 long double
字符型 字符型 char 有符号字符型 signed char 无符号字符型 unsigned char
不完全类型 具有不确定对象未定义类型及长度大小的数组、结构体、联合共用体及 void
派生类型 数组型 结构体型
聚合类型
共用联合体型 函数型 指针型
标量型 基本类型(算术类型) 指针型
(1) 基本类型
基本数据类型也称为算术类型。算术类型由整型和浮点型组成。
(a) 整型
整型数据类型又分为四类。 每一类都有由一个二进制数 0 和 1 表示的值。
字符型(char
有符号字符型(signed char
无符号字符型(unsigned char
• char
有符号整型
无符号整型
枚举型(enumeration
(i) char
char 字符型具有足够的长度,来能够存储基本执行字符集中的任何基本字符。 存储在 char 型对象中的 字符的值将成为正值。 非字符数据将作为无符号整数处理。 不过但是,如果在此情况下发生溢出,则溢 出的部分将被忽略。
42
用户手册 U14872CA1V0UM
2 C 语言的结构
(ii) 有符号整型
有符号整型将进一步分为以下四种类型:
有符号字符型(signed charsigned char
短整形(short intshort int
整形(intint
长整形(long intlong int
声明用 为 signed char 型声明的对象,其存储区具有与无修饰符的 char 型相同大小相同的存储区。 一个没有无修饰符的 int 型对象的大小具有与执行环境的 CPU 体系结构相适应的大小。每个 一个有符号 整型数据都具有其对应的无符号整型数据。 两者的存储区具有相同大小相同的存储区。大于零的 有符号 整型数据的正数是无符号整型数据的一个子集。
(iii) 无符号整型
无符号整型数据用关键字 unsigned 来定义。 任何涉及无符号整型数据的计算都不会发生溢出。 原因在 于,如果涉及无符号整型数据参与的计算的结果是一个不能用一个整型表示的值,则该值将被除,除数就 是一个能够用一个无符号整型可表示的最大数值加 1 来除,并用相除的结果中余数来代替原值。
(iv) 枚举型
枚举就是一个集合,或是列出已知的整型常数列表。 枚举型由一组或多组枚举数据组成。
(b) 浮点型
浮点型又细分为三类。
float
double
long double
在本编译程序该编译器中,将 double 、long double 型及 float 型都作为 ANSI/IEEE 754-198 中规定的单精 度规格标准化数的浮点表达式来支持,标准化的具体内容由 ANSI/IEEE 754-198 规定。因此,float 、 doublelong double 型的值具有相同的的值范围。
用户手册 U14872CA1V0UM
43
2 C 语言的结构
2-3 基本数据类型列表
类型 值的范围
(signed) char –128 ~ +127
unsigned char 0 ~ 255
(signed) short int –32768 ~ +32767
unsigned short int 0 ~ 65535
(signed) int –32768 ~ +32767
unsigned int 0 ~ 65535
(signed) long int –2147483648 ~ +2147483647
unsigned long int 0 ~ 4294967295
float 1.17549435E–38F ~ 3.40282347E+38F
double 1.17549435E–38F ~ 3.40282347E+38F
long double 1.17549435E–38F ~ 3.40282347E+38F
signed 关键字可以省略。 不过,对于 char 型,根据编译时的情况,具体它将被作为 signed char 或还unsigned char 来处理,要根据编译时的条件决定。
short int 数据和 int 数据将作为值范围具有相同值范围、但具有不同类型的数据来处理。
unsigned short int 数据和 unsigned int 数据将作为值范围具有相同值范围、但具有不同类型的数据来处 理。
Float¡¢double long double 数据将作为值范围具有相同值范围、但具有不同类型的数据来处理。
(i) 浮点数(float 型)规范
格式 浮点数的格式如下所示。
44
(高位地址)
s e m
(低位地址)
31 30 23 22 0 这种格式的数值如下。
(符号值的
(–1)
值)
* (尾数值) *2
(指数的值)
s:符号(1 位) 0表示正数,1 表示负数。
e: 指数(8 位) 一个以具有底数为 2 的指数表示为一个 1 字节的整数(在负数情况下,用 2 的补码表示),并在增
加偏移量 7FH 偏移量后使用。 这些关系如下表 2-4 所示。
用户手册 U14872CA1V0UM
2 C 语言的结构
2-4 指数关系
指数(十六进制) 指数的值
FE 127
81 2
80 1
7F 0
7E –1
01 –126
m:尾数(23 位) 尾数被表示为以一个绝对值形式表示,其第 22 位至 0 位相当于二进制数的第 1 位至 23 位。 除非
浮点值是 0,否则指数值总是进行调整,使尾数在 1~2 的范围内(规格标准化)。 结果是,1 的位 置(即值 1)始终是 1,并在此格式下忽略表示。
• 0 的表示 当指数为 0,尾数为 0 时, ±0 的表示如下。
(符号值)
(–1) * 0
无穷大的表示 当指数为 FFH,尾数为 0 时, ±表示如下。
(符号值)
(–1) *
非规格标准化的值 当指数为 0,尾数不为 0 时,非标准规格化的值表示如下。
(符号值)
(–1)
* (尾数值) *2
–126
备注 这里的尾数是一个小于 1 的值,因此尾数的 22 至 0 位表示为
十进制的第 1 至 23 位。
非数值(NaN)表示 当指数为 FFH,尾数不为 0 时,无论符号是多少什么,均表示为 NaN
运算结果舍入 数值被舍入至最接近的偶数。 如果运算结果不能用上述的浮点格式表示,则舍入至最接近的可以表示
的数。
如果舍入前的值有两个不同的可以表示舍入前的值的差的值都可以表示,则舍入至一个偶数(一个最
低二进制最低位为 0 的数)。
用户手册 U14872CA1V0UM
45
运算异常 5 种运算异常,如下表所示。
不能无法运算 非数值(NaN
当发生异常时,调用 matherr 函数会导致出现警告。
(2) 字符类型
字符数据类型包括以下三种。
字符型(char
有符号字符型(signed char
无符号字符型(unsigned char
char
signed char
unsigned char
(3) 不完全类型
不完全数据类型包括以下四种。
具有不确定对象未指定类型及大小的数组
结构体
共用体
void
(4) 派生类型
派生类型分为以下三种。
数组类型
结构体型
共用联合体型
函数型
指针型
(a) 聚合类型
聚合类型又细分为两类。 数组类型和结构体类型。 聚合类型数据是一组连续取的成员对象的集合,成员对象将被顺序提取。
2 C 语言的结构
2-5 运算异常列表
异常 返回值
下溢 非规格化数非标准化数
不准确
上溢
除被 0 除
±0
±
±
46
用户手册 U14872CA1V0UM
2 C 语言的结构
(i) 数组类型
数组类型连续分配一组称为元素类型的成员对象,成员对象此处被称为元素类型。, 成员对象均具有相 同大小的存储区。 数组类型指定数组的元素类型的数量及数组的元素数量。 它不能创建不完全类型的数 组。
(ii) 结构体类型
结构体类型连续分配成员对象,每个对象的大小均可以不同。指定各个成员对象需要 给其给定一个名称 就能指定各个成员对象。
(b) 共用体举型
共用体类型是一组共用内存的成员对象。 这些成员对象在大小和名称上均可以不同,并可以单独指定。
(c) 函数类型
函数类型表示一个具有指定的返回值的函数。 函数类型数据指定了返回值的类型、参数个数以及参数类型。 如果返回值的类型是 T,该函数被称为是一个返回 T 的函数。
(d) 指针类型
指针类型是从一个被称为被引用类型的函数型对象类型中创建的,也可以由及一个不完全类型中创建的。 指 针类型表示一个对象。 对象指示的值用于来指向引用被引用类型的实体。 从由被引用的类型 T 中创建的指针型数据被称为指向 T 的指针。
(5) 标量类型
算术类型(基本类型)及指针类型总称为标量类型。 标量类型包括以下数据类型:
char
有符号整型(Signed integral type
无符号整型(Unsigned integral type
枚举型(Enumeration type
浮点型(Floating-point type
指针型(Pointer type
用户手册 U14872CA1V0UM
47
2 C 语言的结构

2.3.6 相容类型兼容类型和复合类型

(1) 兼容类型相容举型
如果两个类型相同,则说它们是相容兼容的或者具有相容兼容性。 例如,如果在不同的翻译(编译)单元中声明 的两个结构体、共用体或枚举型具有相同的成员数量,相同的成员名称及相容兼容的成员类型,则它们拥有相容兼 容的类型。 在此情况下,两个结构体或共用体的单个成员必须具有相同的顺序,两个枚举型的单个成员(枚举的 常量)必须具有相同的值。 与同一对象或函数有关的所有声明必须具有相容兼容的类型。
(2) 复合类型
复合类型是从两个相容类型兼容类型中创建的。 复合类型的规则如下。
如果两个种类型中的任一个是具有已知类型大小的数组,则复合类型就是一个具有相同这个大小的数组。
如果这两个类型中仅有一个是具带有一个参数类型列表(用原型声明)的函数类型,则复合类型是一个具有参 数类型列表的函数原型。
如果两个类型都具有一个参数类型列表(即具有原型的函数),则复合类型就是具有如下原型的一个:包括由 可以从这两个原型中组合提取的所有信息组成的原型。
[复合原型示例]
假设有以下两个具有文件作用域的声明具有文件作用域。
int f(int(*)(),double(*)[3]); int f(int(*)(char *),double(*)[ ]);
在此情况下,函数的复合类型成为:
int f(int(*)(char *),double(*)[3]);
48
用户手册 U14872CA1V0UM
2 C 语言的结构

2.4 常量

常量是一个其值在程序执行过程中其值不会发生变化的变量,该值必须预先设置。 每个常量的类型根据为该常量指
定的格式和值来决定。 常量的类型有如下四种。
浮点型常量(Floating-point constants
整型常量 Integer constants
枚举型常量(Enumeration constants
字符型常量(Character constants

2.4.1 浮点型常量

一个浮点型常量由一个有效的数字部分、指数部分和浮点后缀组成。
有效数字部分: 整数部分、小数点和小数部分 指数部分: e 或 E,有符号指数 浮点后缀: f/F float)
I/L long double 如果省略(double
指数部分的带符号指数和浮点后缀可以省略。 无论整数部分还是小数部分都必须被包括在有效数字内。 而且,无论是小数点还是指数部分不可或缺都必须被包括
(例如:1.23F 2e3)。

2.4.2 整型常量

整型常量以一个数字开始,不包括小数点或指数部分。 可以在整型常量后添加一个无符号后缀,以表明该整型常量
是无符号的。 可以在整型常量后添加一个长整型后缀,以表明该整型常量是长整型的。
共有以下三种整型常量。
十进制常量: 以一个非 0 数字开始的十进制数 十进制数字 = 123456789
八进制常量: 整型后前缀 0 + 八进制数 八进制数 = 01234567
十六进制常量: 整型后前缀 0x 0X + 十六进制数字 十六进制 数字 = 0123456789
abcdef ABCDEF
无符号后缀
u U 长整型后缀
l L
(1) 十进制常量
十进制常量是一个以 10 为底数(基数)的整数,该数必须以非 0 的数值开始,其后跟随任何的数字可以是从 0 至 9 的任何数字数(例如:56U)。
用户手册 U14872CA1V0UM
49
2 C 语言的结构
(2) 八进制常量
八进制常量是一个以 8 为底数(基数)的整数,该数必须以 0 开始,其后跟随的数字可以是从 0 至 7 的任何数字任 何从 0 至 7 的数(例如:034U)。
(3) 十六进制常量
十六进制常量是一个以 16 为底数(基数)的整数,该数必须以 0x 0X 开始,其后跟随的数字可以是从 0 至 9、af A F 的数的任何数字任何从 0 9a f A F 的数,a f A F 表示从 10 15 的数(例如: 0xF3)。
这个类型的整型常量被视为首选的可表示类型,如下所示。 在本编译程序该编译器中,根据编译程序的条件(选项),无下标的常量的类型可以更改为 charunsigned
char
(整型常量) (可表示的类型)
无后缀十进制数 ....................................................intlong intunsigned long int
无后缀八进制、十六进制数 ..................................intunsigned intlong intunsigned long int
后缀 u U ...........................................................unsigned intunsigned long int
后缀 l L.............................................................long intunsigned long int
后缀 u Ul L ...............................................unsigned long int

2.4.3 枚举常量

枚举常量用于表示一个枚举型变量的一个元素,即只能取标识符表示的特定值的枚举型变量的值只能是特定值,此特
殊值由标识符给定。
枚举型(enum)可以是以下列出的三种类型中的任何一种,可以表示所有的枚举常量。 枚举常量由标识符表示。
有符号字符型(signed char
无符号字符型(unsigned char
有符号整型 signed int
它的描述方法是enum 枚举型{枚举常量列表}”
示例: enum months{January=1,February,March,April,May};
当使用 = 指定整数时,枚举变量具有整数值,且其后的枚举变量值为上述整数值顺序 +1。在上述示例 中,枚举变量的值分别为 1,2,3,4
5。 当没有“= 1”的标识时,每个常量的值分别为 012
34 5
50
用户手册 U14872CA1V0UM
2 C 语言的结构

2.4.4 字符常量

字符常量是括在一对单引号对中的一单个字符字符或多个字符串,如‘X’或‘ab’。 字符常量不包括单引号(’)、反斜线(¥ 或\)和换行符(¥n)。 要表示这些字符,需要使用由转义字符序列。 有
以下三种转义字符序列。
简单转义字符序列: \’ \” \?
\a \b \f \n \r \t \v
八进制转义字符序列: \八进制数 [八进制数 八进制数] (示例:\012,\0
十六进制转义字符序列: \x 十六进制数 (示例: \xFF
1
2
1. 空字符
2. 在本编译程序该编译器中,\xFF 表示–1。不过,如果增加了将 char 视为 unsigned char 的条件(选项), 它则表示的值就是+255

2.5 字符串文字

字符串文字是括放在一对双引号对中的零个或更多个字符(例如:“xyz”)。 单引号(’)可以由单引号本身来表示,或者由转义字符序列\’表示,而双引号(”)则由 字符转义序列\”来表示。 数组元素可以有是 char 型的字符串文字,并由给出定的标记进行初始化(例如:char array [ ] = “abc”;)。

2.6 运算符

运算符如下所示。
[] () . -> ++ -- & * + – ~ ! sizeof / % << >> < > <= >= == != ^ | && || ? : = *= /= %= += -= <<= >>= &= ^= |= , # ##
[ ]( )和?:运算符必须成对使用。 一个表达式必须在方括号“[ ]”、圆括号“( )”“?”“:”之间描述。 # ##运算符只能用于在预处理指令时中定义宏。 (有关介绍,请参阅第 5 章 运算符与表达式。)
用户手册 U14872CA1V0UM
51
2 C 语言的结构

2.7 定界符

定界符是一个具有独立的句法或意义的符号。 不过,但是它绝不会产生一个值。 在 C 语言中使用的定界符如下所示。
[] () {} * , : = ; ... #
一个表达式声明或语句可以在方括号“[ ]”、圆括号“( )”或花括号“{ }”中进行描述。 这些定界符必须如上述所示的那
样成对使用。 定界符 ##只能用于预处理指令。

2.8 头文件名

头文件名表示一个外部源文件的名称。该名只能在预处理指令“#include”中使用。 下面是一个头文件名的 #include 指令的示例。 关于各个 #include 指令的详细情况,请参阅 9.2 源文件包含指
#include <header name> #include “header name”

2.9 注释

注释是指包括在 C 源程序模块中提供作为参考信息的语句。 它以“/*”开始,以“*/”结束。 也可以使用 -ZP 选项将“//”
后至换行符之间的部分所有标识作为注释语句处理。
示例: /* 注释语句 */ //注释语句
52
用户手册 U14872CA1V0UM

第 3章 数据类型与存储类的声明

本章介绍如何声明 C 中使用的数据(变量)或函数,以及每个数据或函数的作用域。 声明是对一个标识符或一组标
识符的解释或属性进行的说明。通过 声明可以为标识符命名的对象或函数保留一个适当的存储区,被称为定义”。
下面是一个声明的示例。
#define TRUE 1 #define FALSE 0 #define SIZE 200
void main(void) { auto int i,prime,k; /* 声明自动变量 */
for(i=0;i<=SIZE;i++) mark[i]=TRUE; . . .
声明由存储类说明符、类型说明符、初始化声明符说明符等组成。 存储类说明符及类型说明符将会指定由声明符说 明符所定义指定的实体的连接、存储时间生存期及类型。 初始化声明符说明符列表会列出所有每个的声明符说明符, 之间且由一个逗号分开。 每个声明符说明符都可以有附加的类型信息或一个初始化符,或者二者兼有。
如果一个对象的标识符声明它无没有连接,则该对象的类型必须是恰当的(对象具有大小相关的信息),位置处于在 声明符说明符或初始化声明符说明符(如果有的话)尾部该对象的类型必须是完整的(具有与大小相关信息的对象)。
用户手册 U14872CA1V0UM
53
第 3 章 数据类型与存储类的声明

3.1 存储类说明符

存储类说明符指定一个对象的存储类别。 它说明对象的作用域和对象具有的值的的存储位置单元,以及对象的作用
域。 在一个声明中,只能说明一个存储类说明符。 共有以下 5 个存储类说明符可供使用。
typedef
extern
static
auto
register
(1) typedef
typedef 说明符声明一个为指定的类型声明一个的替代名。 关于 typedef 说明符的详细情况,请参阅第 3.6 节 typedef 说明符。
(2) extern
extern 说明符说明(告诉编译程序编译器)在紧随该说明符之后前的这一个变量是在其他程序中其他地方声明的 (即,一个外部变量)。
(3) static
static 说明符说明对象具有静态存储生存期时间。 对于具有静态存储生存期时间的对象,在程序执行前就会为其 保留一个存储区被保留下来,且待存储的值只初始化一次。 对象存在于整个程序的整个执行过程中,并保持其最 后存储的值。
(4) auto
auto 说明符说明对象具有自动存储生存期时间。 对于具有自动存储生存期时间的对象,当这些对象进入一个其待 声明语句所在的程序块时,将为其保留一个存储区。 在从开始顶部进入这个包含声明语句的程序块时,如果有指定的话,对象将进行初始化(如果有规定的话)。 如 果对象是通过调转到跳到程序块内的一个标签标号的方式而进入程序块时,该对象将不进行初始化。 当执行完毕声明语句所在的程序块执行完毕时,为具有自动存储生存期时间的对象所保留的存储区将无法得不到保 证。
(5) register
register 说明符将一个对象指定分配给 CPU 的寄存器分配一个对象。 对于本该 C 编译程序编译器,它将被分配 给到 CPU 的寄存器或 saddr 区域存储区。 关于寄存器变量的详细情况,请参阅第 11 章 扩展功能函数。
54
用户手册 U14872CA1V0UM
第 3 章 数据类型与存储类的声明

3.2 类型说明符

类型说明符指定(或表示)一个对象的类型。 有以下的类型说明符可供使用。
void(空类型)
char(字符型)
short(短整型)
int(整型)
long(长整型)
float(浮点型)
double(双精度型)
long double(空)
signed(有符号型)
unsigned(无符号型)
Structure or union specifier(结构体或共用体说明符)
Enumeration specifier(枚举说明符)
typedef
在该本 C 编译程序编译器中,增加了以下类型说明符。
bit/boolean/_ _boolean
用户手册 U14872CA1V0UM
55
第 3 章 数据类型与存储类的声明
下面是对每个类型说明符的含义以及在本 C 编译程序编译器中可以表示的极限值(圆括号中的值)加以的说明。 对
于浮点运算,由于本编译程序编译器只支持 IEEE Std 754-1985 标准的单精度,因此 double 和 long doublefloat 数据 被认为具有与 float 数据 相同的格式。
void...................................................................... 空值集合
char ..................................................................... 可以存储的基本字符集数量
signed char......................................................... 带符号有符号整数(–128 ~ +127
unsigned char..................................................... 无符号整数(0 ~ 255
short, signed short, short int,
signed short int.................................................. 带符号有符号整数(–32768 ~ +32767
unsigned short, unsigned short int.................. 无符号整数(0 ~ 65535
int, signed, signed int ........................................ 带符号有符号整数(–32768 ~ +32767
unsigned, unsigned int...................................... 无符号整数(0 ~ 65535
long, signed long, long int,
signed long int.................................................... 带符号有符号整数(–2147483648 ~ +2147483647
unsigned long, unsigned long int..................... 无符号整数(0 ~ 4294967295
float ..................................................................... 单精度浮点数(1.17549435E–38F ~ 3.40282347E+38F
double ................................................................. 双精度浮点数(1.17549435E–38F ~ 3.40282347E+38F
long double......................................................... 扩展精度浮点数
1.17549435E–38F ~ 3.40282347E+38F
Structure/union specifier 结构体/联合体说明符. 成员对象集合
Enumeration specifier 枚举说明符..................... int 型常量集合
typedef name.................................................. 指定类型的替代名
bit, boolean, _ _boolean .................................... 表示一个位的整数(0 1
用斜线分开的说明符具有相同大小。
56
用户手册 U14872CA1V0UM
第 3 章 数据类型与存储类的声明

3.2.1 结构体说明符与联合体共用体说明符

结构体说明符和共用体说明符均说明一组指定命名的成员(对象)。 这些成员对象的类型可以互不相同。
(1) 结构体说明符
结构体说明符将一组两个或多个不同类型的一组变量声明为一个对象。 每个类型的对象称为一个成员,并可以为 其赋予一个名称。 并为成员按照它们的声明顺序保留连续的存储区。 不过,由于 78K/0S 系列具有如下限制:字数据不能从奇地址中读取,也无法将字数据写入奇地址存取字数据,。 因此默认情况下代码大小要进行优先级更高排定,可以并插入对齐数据以确保 2 字节或多字节的成员被分配给到偶 地址。 由于对齐数据的原因,所以,在成员之间可能会产生间隙。 可以指定 -RC 选项来禁止插入对齐数据,以便使得结构更加紧凑。 在这种此情况下,尽管减小了数据的大小数 量,但是,分配给到奇地址 2 字节或多字节的成员是通过使用单 1 字节读/写代码来实现读/写的,这样会就增加了 代码的大小。 结构体的声明如下。但是 不过,并声明不会为声明分配内存地址,因为它没有结构体变量列表。 关于结构体变量 的定义,请参阅7 章 结构体与共用体
struct 标识符 {成员声明列表};
结构体声明示例
struct tnode{ int count; struct tnode *left,*right;
};
(2) 共用体说明符
共用体说明符将一组两个或多个不同类型的一组变量声明为一个对象。 每个类型的对象称为一个成员,并可以为 其赋予一个名称。 共用体的成员在存储区上是互相重叠的,即它们共用相同的存储区空间。 共用体的声明如下。但是,并不会为声明 不过,声明不会分配内存地址,因为它没有共用体变量列表。 关于共用 体变量的定义,请参阅7 章 结构体与共用体
共用体标识符{成员声明列表};
共用体声明示例
union u_tag{ int var1 ; long var2 ;
};
每个成员对象可以是任意类型,不完全类型和函数类型除之外的任意类型。 成员可以用规定的位数来声明。 具有 指定的位数的成员称为位域段。 本编译程序编译器中增加了与位域位段声明有关的扩展函数。 详细情况,请参阅 11.5 (14) 位位域段声明
用户手册 U14872CA1V0UM
57
第 3 章 数据类型与存储类的声明
(3) 位段位域
位段位域是一个整型区域,由指定数量的位组成。 可以在为位段位域中指定 int 型、 unsigned int 型及 signed int 型的数据
1
。没有无修饰符的 int 域段的最高有效位或 signed int 域段的最高有效位将被认定判为符号位
如果存在两个或多个位段位域,只要在指定的这个相同的内存单元中有足够的空间,则第二个及后续的位段位域将 被压缩到为相邻的位位置。 通过放置具有零宽度的未命名位段位域,则下一个位段位域将不被压缩到相同内存单 元内的一个空间中。 一个未命名的位段位域没有声明符说明符,仅声明一个冒号和宽度。 单目&运算符&(取地址)不能应用到位段位域对象。
1. 在本编译程序编译器中,还可以指定 char 型、 unsigned char 型及 signed char 型。 它们均被视为
unsigned 型,因为本编译程序编译器不支持 signed 型位段位域。
2. 在本编译程序编译器中,可以使用编译程序编译器选项 -RB 来更改位段位域分配的方向(详细情况,
请参阅11 章 扩展功能函数)
下面是一个位段位域示例。
struct data{ unsigned int a:2; unsigned int b:3; unsigned int c:1; }no1;
2
58
用户手册 U14872CA1V0UM
第 3 章 数据类型与存储类的声明

3.2.2 枚举说明符

枚举型说明符是说明按顺序放置的一系列对象列表。 用 enum 说明符声明的对象将被声明为 int 型的常量。 枚举型说明符的声明如下所示。
enum 标识符{成员列表}
对象使用枚举符列表进行声明。 并为列表中的所有对象按照它们的声明顺序定义一个值,方法是:为第一个对象赋 予 0 值,前一个对象的值加 1 赋予第二个及后续的对象的值等于前一个对象的值加 1。 还可以使用“=”指定一个常量 值。
在下面的例子中,“hue”被假设为枚举的标记名,“col”为具有该(enum)类型的一个对象,“cp”为指向具有该类型 的一个对象的指针。 在该声明中,枚举的值变为”{0,1,20,21}”。
enum hue{ chartreuse, burgundy, claret=20, winedark }; enum hue col,*cp; void main(void) { col=claret; cp=&col ; /*...*/ (*cp!=burgundy) /*...*/ . . .
用户手册 U14872CA1V0UM
59
第 3 章 数据类型与存储类的声明

3.2.3 标记

标记是为结构体、共用体或枚举型指定的一个名称。 标记具有一个已声明的数据类型,相同类型的对象可以使用标
记进行声明相同类型的对象。
以下声明中的标识符是一个标记名。
structure/union 标识符 {成员声明列表} enum 标识符{枚举符列表}
标记包含结构体/共用体或成员定义的枚举的内容,其中已经定义了成员变量。在后续的声明中,结构体、共用体或 枚举型的结构变得与标记的列表的结构相同。在具有相同作用域内的后续声明中,花括号中的列表必须省略。下面的类 型说明符未定义其内容,因此,结构体或共用体具有为不完全类型。
structure/union 标识符
仅当对象大小不必要无需指定时,才可以使用标记指定该类型说明符的类型。 原因在于,在相同作用域内定义标记 的内容时,类型说明将变得不完全。
在下面的例子中,“tnode”标记指定了一个结构体,其中包含一个整数指针及两个同类型的对象的结构体。
struct tnode{ int count; struct tnode *left,*right; };
下例将“s”声明为一个具有由标记(tnode)指定的类型的对象,将“sp”声明为指向此类具有标记说明的类型的对象的 指针,这个对象由标记来说明其类型。 通过这种声明,表达式“sp left”表示一个指向“sp”所指的对象左侧的“struct
tnode”的指针;“s.right count”表示“count”,它是“s”右侧“struct tnode”的一个成员。
typedef struct tnode TNODE; struct tnode{ int count; struct tnode *left,*right; };
TNODE s *sp; void main(void){ sp->left=sp->right; s.right->count=2; }
60
用户手册 U14872CA1V0UM
第 3 章 数据类型与存储类的声明

3.3 类型修饰符

有两个类型修饰符可供使用:const 及 volatile。 这两个修饰符只影响左侧的值。 。 使用一个具有非 const 型修饰符的左侧值不能更改使用 const 型修饰符定义的一个对象。 使用一个具有非 volatile
型修饰符的左侧值不能引用使用 volatile 型修饰符定义的一个对象。
一个用具有 volatile 修饰符定义类型的对象可能会被编译程序编译器无法不易识别的方法更改,或者具有其他不易注
意的副作用。 因此,引用该对象的表达式必须对该对象严格求解,必须符合根据规定用 C 语言编写的程序如何抽象调 整执行的顺序规则对引用该对象的表达式进行严格求解。 此外,在每个序列点,最后存储在对象中的值必须与那些由 程序确定决定的值一致,除非出现由于上述的编译程序编译器无法不能识别的因素引起的更改。
如果使用类型修饰符指定了一个数组类型,则修饰符适用于数组元素,而非数组本身。 在指定说明函数类型时不可能包括进类型修饰符。 不过,在 2.2 关键字中提到的本编译程序编译器特有的类型修饰
callt, _ _ callt, callf, _ _ callf, noauto, norec, _ _ leaf, _ _ interrupt, _ _ interrupt_brk, _ _rto s_interrupt, _
_pascal 都可以作为修饰符来修饰函数类型包括进来。
sreg, _ _sreg, _ _directmap _ _temp 也是类型修饰符。
在下面的例子中,“real_time_clock”可以被硬件更改,但是诸如赋值、递增、递减等运算则无法不能更改其值。
extern const volatile int real_time_clock;
一个使用类型修饰符更改聚合类型数据的示例如下。
const struct s{int mem;} cs={1}; struct s ncs; /* 对象 ncs 可以更改的 */
typedef int A[2][3]; const A a={{4,5,6},{7,8,9}}; /* array of const 整型二维数组 int array */
int *pi; const int *pci;
ncs=cs; /* 正确 */ cs=ncs; /* 违反对左值的 volatile 限制,左值它具有可调整更改的赋值运算符 */ pi=&ncs.mem; /* 正确*/ pi=&cs.mem; /* 违 反赋值运算符 = 的类型的 volatile 限制 */ pci=&cs.mem; /* 正确*/ pi=a[0]; /* 不正确:a[0] 具有 “const int *” 类型 */
用户手册 U14872CA1V0UM
61
第 3 章 数据类型与存储类的声明

3.4 说明符

说明符用于说明一个标识符。 这里主要讨论介绍指针说明符、数组说明符和函数说明符。说明符可以决定 标识符 的作用域,也可以决定函数或对象的、以及具有存储时间存储生存期和类型的函数或对象的作用域由说明符来决定。
下面对各种说明符依次进行一一介绍。

3.4.1 指针说明符

指针说明符说明表示待声明说明的标识符是一个指针。 指针指向(指示)存储一个值的存储位置单元。 指针声明 如下所示。
* 类型修饰符列表 标识符
通过该声明,标识符成为指向 T1 的指针。
以下两个声明分别表示一个指向常量值的变量指针,一个指向一个变量值的常量指针。
const int *ptr_to_constant; int *const constant_ptr;
第一个声明表示指针“ptr_to_constant”所指的常量“const int”的值不能更改;但是指针“ptr_to_constant”本身可以更改 以指向另一个“const int”型常量。 同样,第二个声明表示指针“constant_ptr”所指的变量“int”的值可以更改;但是指针 “constant_ptr”本身则永远指向相同的位置。
通过添加给指向 int 整型数据的加入指针类型的定义,可以使得常量指针“constant_ptr”的声明有所不同。
下例将“constant_ptr”声明为一个对象,该对象是具有指向 int 型值的 const 修饰符并指向 int 型的指针类型。
typedef int *int_ptr; const int_ptr constant_ptr;
62
用户手册 U14872CA1V0UM
第 3 章 数据类型与存储类的声明

3.4.2 数组声明符说明符

数组声明符说明符向编译程序编译器声明说明要声明的标识符是一个具有数组类型的对象。 数组声明的方式如下所示。
类型 标识符 [常量表达式]
通过该声明,标识符成为具有声明的类型的数组。 常量表达式的值指定成为数组的元素个数。 常量表达式必须是
一个其值大于 0 的整型常量表达式。 在声明数组时,如果未指定一个常量表达式,则数组将变为不完全类型。
在下面的例子中,声明了由 11 个元素组成的 char 型数组“a[ ]”,和还声明了有由 17 个声明的元素组成的 char 型指
针数组“ap[ ]”
char a[11],*ap[17];
在以下两个声明的例子中,第一个声明中的“x”指定一个指向 int 型数据的指针,第二个声明中的“y”指定一个 int 型的
数组,该数组没有指定大小,需要在程序中的其他地方声明。
extern int *x; extern int y[];

3.4.3 函数声明符说明符(包括原型声明)

函数声明符说明符声明引用的函数返回值和参数的类型,以及待引用的函数的参数值的类型。 函数声明如下所示。
类型 标识符(参数列表或标识符列表)
通过该声明,标识符变为一个函数,该函数具有参数类型列表指定的参数,函数并返回值的类型就是在标识符之前声
明的类型的值。函数的参数由参数标识符列表来指定。通过这些列表,就指定了一个说明参数及其类型的标识符,它用 来表示参数及其类型。在头文件stdarg.h中定义的宏将括省略号(, ...)中描述的列表转换为参数。对于没有参数说明 的函数,参数列表将变为void”。
用户手册 U14872CA1V0UM
63
第 3 章 数据类型与存储类的声明

3.5 类型名

类型名就是数据类型的名称,用于说明函数或对象的大小。 从句法上讲,它是一个去掉标识符的函数或对象声明。
下面给出了类型名的示例。
• int ................................................... 指定 int
• int *................................................. 指定一个指向 int 型变量的指针。
• int *[3]............................................. 指定一个数组,该数组有三个指向 int 型变量的指针。
• int (*) [3].......................................... 指定一个指针,该指针指向一个具有三个 int 型变量的数组,该数组具有三
int 型变量元素。
• int *( ) ............................................ 指定一个函数,该函数返回一个指向 int 型变量的指向没有参数说明的 int
型变量的指针,该函数没有参数说明。
• int (*) (void)..................................... 指定一个指向函数的指针,该函数返回一个没有参数说明的 int 型的值,该函
数没有参数说明。
• int (*const [ ]) (unsigned int, ...) ... 指定一组指向函数的指针,函数的变量名是不定大小未定数量的常量数组,这
些数组中的函数数组具有一个 unsigned int 型的参数,还有和一个指向各个 返回一个 int 型值的函数的常量指针,函数会返回一个 int 型值。
64
用户手册 U14872CA1V0UM
第 3 章 数据类型与存储类的声明

3.6 typedef 声明

typedef 关键字定义一个与指定的类型同义的标识符,该标识符与指定的类型具有相同的使用方法。 被定义的标识
符成为 typedef 名。
typedef 名的句法如下所示。
typedef 类型 标识符;
在下面的例子中,distance是一个 int 型,metricp的类型是一个指向一个函数的指针,该函数返回一个没有参数
说明的 int 型值。,“z”的类型是一个指定的结构体,“zp”是一个指向该结构体的指针。
typedef int MILES,KLICKSP(); typedef struct{long re,im} complex; /*...*/ MILES distance; extern KLICKSP *metricp; complex z,*zp;
在下面的例子中,指定用 typedeft 代表带符号有符号整型,用 typedefplain 代表 int 整 型,并声明了一个
具有三个位段位域成员的结构体。 位段位域成员如下所示。
位域成员名称为 t ,值为 0 ~ 15 的位段成员
位域成员没有名称 const 限定的值为–16 ~ +15(如果访问)的位段成员
位域成员名称为 r ,值为 –16 ~ +15 的位段成员
typedef signed int t; typedef int plain; struct tag{ unsigned t:4; const t:5; plain r:5; };
在本例中,这两个位段位域声明的差别在于,第一个位段位域声明有 unsigned 作为类型说明符(因此,t 成为结构体成 员的名称),第二个位段位域声明有 const 作为类型说明符(修饰符 t 可以被称为 typedef 名的说明符 t )。 在此声 明之后,如果发现有
t f(t(t)); long t;
在有效范围内,则函数 f 被声明为“具有一个参数并返回 signed int 型值的函数”,函数的这个参数被声明为“指向函数的 指针类型,该函数具有一个参数并返回 signed int 型值的函数的指针类型”。 标识符 The identifier t 被声明为 long 型。is declared as long type.
用户手册 U14872CA1V0UM
65
第 3 章 数据类型与存储类的声明
typedef 名有助于还可用于方便读程序的阅读。 例如, signal 函数的以下三个声明都一样效果,均指定的函数与和
未使用 typedef 的第一个种函数声明方法相同的类型。
typedef void fv(int); typedef void (*pfv)(int);
void(*signal(int,void(*)(int)))(int); fv *signal(int,fv *); pfv signal(int,pfv);
66
用户手册 U14872CA1V0UM
第 3 章 数据类型与存储类的声明

3.7 初始化

初始化指的是预先为在一个对象中预先设置一个值。 初始化符完成对象的初始化。 初始化的执行如下所示。
对象 = {初始化符列表}
初始化符列表必须包含待初始化的各个对象需要使用的初始化符。 对于具有静态存储时间存储生存期的对象和以及具有聚合类型或共用体类型的对象来说,其初始化符中的所有表达式
或初始化符列表都中的所有表达式必须使用常量表达式指定。
声明其作用域为块作用域,但具有外部或内部连接的标识符不能初始化。
(1) 具有静态存储时间存储生存期的对象的初始化
如果未对初始化具有静态存储时间存储生存期的算术型对象进行初始化处理,则对象的值将隐性含地被初始化为 0。 同样地,具有静态存储时间存储生存期的指针型对象将被默认初始化为一个 null 空指针常量。
示例 unsigned int gval1; /* 初始化为 0 */ static int gval2; /* 初始化为 0 */
void func(void){ static char aval; /* 初始化为 0 */
}
(2) 具有自动存储时间存储生存期的对象的初始化
如果未不进行初始化处理,则具有自动存储时间存储生存期的对象的值将变得不确定,并且无法得不到保证。
示例 void func(void){ char aval; /*在此点未定义*/
. . . aval=1; /* 初始化为 1 */
}
(3) 字符数组的初始化
字符数组可以用字符串文字进行初始化(包含在“”中的字符串)。 同样地,包含一系列字符串形式的文字的字符串 可以用来对初始化一个数组的单个成员或元素进行初始化。 在下面的例子中,定义了无没有类型修饰符的数组对象“s”和“t”,并使用字符串文字来初始化每个数组的元素。
char s[]="abc",t[3]="abc";
下面的例子如上面的数组初始化示例作用相同。
用户手册 U14872CA1V0UM
67
3 数据类型与存储类的声明
char s[]={'a','b','c','\0'}, t[]={'a','b','c'};
下面的例子定义 p 为“指向 char 型变量的指针”,且成员用字符串文字进行初始化,以便所以长度指示一个“char 数 组”型对象。
char *p="abc";
(4) 聚合或共用体型对象的初始化
聚合型 聚合类型的对象用一系列初始化符列表来进行初始化,这些初始化符按照下标顺序或成员的描述顺序升序进行
描述。 待指定的一系列初始化符列表必须用花括号括起来。
如果列表中的初始化符的数量少于聚合成员的数量,则未被初始化符覆盖到的成员将隐式地被初始化,默认被
当作像一个是具有静态存储时间存储生存期的对象一样进行初始化。
对于一个未知大小未知的数组,元素的数量由初始化符的数量控制,且数组将不再是一个完全的类型。
共用体型 共用体型对象用括号中的共用体的第一个成员作为的初始化符来进行共用体型对象的初始化处理过程。
在下面的例子中,具有未知大小未知的数组“x”将变为一个一维数组,该数组初始化后有三个元素。
int x[]={1,3,5};
下面的例子显示了一个完整的定义,其中初始化符被括在花括号中。 “{1, 3, 5}”初始化数组对象“y[0]”的第一个行中 的“y [0] [0]”,“y [0] [1]”和“y [0] [2]” 。 同样,在第二行中,数组对象“y [1]”和“y [2]”的元素被初始化。 。 “y[3]”的初 始值是 0,因为它未被指定它的值。
char y[4][3]={ {1,3,5}, {2,4,6}, {3,5,7}, };
下面的例子产生同上面的例子相同的结果。
char z[4][3]={ 1,3,5,2,4,6,3,5,7 };
在下面的例子中,第一行“z”中第一行的元素被初始化为指定的值,其余的元素被初始化为 0
68
用户手册 U14872CA1V0UM
第 3 章 数据类型与存储类的声明
char z[4][3] = { {1}, {2}, {3}, {4} };
在下一个面的示例中, 一个三维数组被初始化。 q[0] [0] [0] 初始化为 1,q[1] [0] [0] 初始化为 2,q[1] [0] [1] 初始化为 3。q[2] [0] [0],q[2] [0] [1] 和 q[2] [1] [0]分别 被初始化为 4,5,6。 其余的元素均被初始化为 0。
short q[4][3][2] = { {1}, {2, 3} {4, 5, 6} };
下面的例子如上面的三维数组初始化产生相同的结果。
short q[4][3][2] = { 1, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 4, 5, 6 };
下面的例子使用花括号显示了上面初始化的完整的定义。
Short q[4][3][2] = { { {1}, }, { {2, 3}, }, { {4, 5, 6}, } };
用户手册 U14872CA1V0UM
69

第 4章 类型转换

如果在一个表达式中参与运算的两个运算数的类型不同,则编译程序编译器将自动执行类型转换操作运算。 这种类 型转换与使用类型转换运算符得到的结果类似。 这种自动类型转换叫做隐式类型转换。 本章将详细介绍这种隐式类型 转换。
类型转换运算包括通常见的算术转换、涉及截断/舍入的转换以及涉及符号变化的转换。 表 4-1 给出了一个类型转换 的列表。
70
用户手册 U14872CA1V0UM
4 章 类型转换
4-1 类型转换列表
转换后
转换前
(带符号有符 号)char
N { N
无符号 char
(带符号有符 号)short int
N N { N
无符号 short int
(带符号有符 号) int
N N { N
无符号 int
(带符号有符 号) long int
N
无符号 long int
float
double
long double
+
+
+
+
无符号
(带符 号有符
char
号)
char
Δ
(带符 号有符 号)
short int
{ { { { { { { { { {
无符号
short int
{ { { { { { { { {
{
Δ
Δ
{
(带符 号有符 号)
int
{
Δ
Δ
无符号
int
N
{ { { { { {
{ { { { { {
无符号
(带符 号有符
long int
号)
long int
{
{ { { { {
{ { { { {
Δ
float double long
N
{ { {
{ { {
{ { {
{ { { {
{ { {
{ { {
{ {
double
备注 1. signed 关键字可以省略。 不过但是,对于 char 型数据,根据编译时的条件(选项),它将被视为
signed char unsigned char 型,具体情况要根据编译时的条件(选项)决定。
2. 约定 {: 可以正常执行类型转换 \: 不可以执行类型转换 N: 不会产生正确的值。 (数据类型将会被视为一个无符号 int 型数据。) Δ: 数据类型不会以位映像图方式转换。但是 不过,如果一个正数不足以表示它,将不会产生一个正
确的值。(被视为一个无符号整数)
空白: 转换结果中的溢出将被截断。 根据转换后的类型,数据的 + 或 – 符号可能会被改变。
用户手册 U14872CA1V0UM
71
4 章 类型转换

4.1 算术运算数

(1) 字符与整数(一般整型提升)
如果 charshort int int 型位段位域的数据类型(无论是带符号有符号的还是无符号的)的数据类型或者枚举 型对象的数据类型的值的范围在 int 型可以表示的范围内,则这些数据类型将被转换为 int 型,前提是他们的值的 范围在 int 型可以表示的范围内。 如果不在其范围内,则它们将被转换为 unsigned int 型。 这种隐式的转换称 为“一般整型提升”。 并非所有其他的算术类型都不会受此根据该一般整型提升的影响,也不会进行转换。 一般整型提升将保留原始数据类型的值及符号。 在本编译程序编译器中,无没有类型修饰符的 char 型数据通常被将当作为 signed char 型数据处理。 它还可以 使用选项来作为 unsigned char 型数据处理。
(2) 带符号有符号整数与无符号整数
当一个整型数据被转换为另一种数据时,如果其值可以用转换后的整型转换后的类型来表示,则该值将不会更改。 当一个带符号有符号整数被转换为一个具有相同或更大长度的无符号整数时,其值将不改变,除非带符号有符号整 数的值是小于零的负值的。 如果带符号有符号整数的值是负的,且无符号整数的长度大于带符号有符号整数的长 度,则带符号有符号整数将被扩展,符号位的扩展将保证至具有与无符号整数相同长度的带符号有符号整数具有与 无符号整数相同的长度,然后为其加上与无符号整数可以表示的最大值加 1 相等的值,这样才完成然后将转换前的 带符号有符号整数向转换为一个无符号值的转换。 当一个整型值被转换为一个具有较小长度的无符号整型值时,转换结果是一个非负余数,且这个余数是其该整型值 除以将被转换后无符号整数所能表示的最大值加 1 极限值得到的,极限值等于被转换后无符号整数所能表示的最大 值加 1 得到值相除。 当一个整型值被转换为一个具有较小长度的带符号有符号整型值时,或者当一个无符号整数 被转换为一个具有相同长度的带符号有符号整数时,如果转换后的值无法不能表示出来,则溢出的值将被忽略。 有关转换模式,请参见表 4-1 类型转换列表。 下面的表 4-2 列出了从有符号整型向无符号整型之间的转换运算。
4-2 从带符号有符号整型向无符号整型之间的转换
值范围更小 值范围更大
带符号有符
+ /
– / +
{: 可以正常进行执行类型转换 +: 数据将被转换为一个正数。 /: 转换结果是该整数值对被转换的类型所能表示的最大值加 1 取模得到的余
数,原整数值除以(被转换的类型所能表示的最大值加 1)。
无符号
{
72
用户手册 U14872CA1V0UM
4 章 类型转换
(3) 通常常见算术类型转换
对算术型数据进行运算得到类型可以有各种值。 运算结果的类型转换方法介绍如下。
如果运算数中有任一个是 long double 型,则另一个将被转换为 long double 型。
如果运算数中有任一个是 double 型,则另一个将被转换为 double 型。
如果运算数中有任一个是 float 型,则另一个将被转换为 float 型。
对于其他情况,将根据以下规则对两个运算数进行执行通用整数扩展。 图 4-1 给出了这些规则。
4-1 通常算术类型转换
无符号长整形
无符号整形
整形
.........................
长整形
.........................
.........................
.........................
如果两个操作数都是无符号数,或者其中一个操作数为长整形,另外一个 为无符号整形数,如果无符号整形数的值不能用长整形数表示,则所有的操作 数将被转换成无符号长整形数。
除了以上情况,如果一个操作数为长整形,另外一个操作数不能用长整形表示, 则另外一个操作数将被转换成长整形数。
除了以上情况,如果其中一个操作数是 无符号整形数, 则另外一个操作数 将被转换成无符号整形数。
除了以上情况,操作数都是整形数.
在本编译程序编译器中,可以使用编译条件(优化选项)有意地禁止向 int 型的转换(详细情况,请参阅 CC78K0S C 编译程序编译器操作篇运算 (U14871E) 第 5 章 编译程序编译选项)。
用户手册 U14872CA1V0UM
73
4 章 类型转换

4.2 其他运算数

(1) 左值与函数定位符
左值是指指定一个对象的表达式(是除具有对象类型或 void 型以外的不完全类型)。 不包括非数组类型、不完全类型或 const 修饰符类型的左值,以及没有加 const 修饰符类型成员的结构体或共用 体都是“可更改的左值”。 一个非不包括数组类型的左值将被转换为一个存储在待指定的对象中的值,除非该值是 sizeof 运算符、单目 & 运 算符、++ 运算符或 - - 运算符的一个运算数,或一个运算符的左运算数或赋值运算符的运算数。通过转换,它将不 再是一个左值。 具有不完全类型而非数组类型的左值的行为将得不到保证。 具有除字符数组以外的“数组”类型的左值将被转换为一个具有“指向 ...的指针”类型的表达式。这种表达式将不再是 一个左值。 函数定位符是一个具有函数类型的表达式。除了 sizeof 运算符或单目 & 运算符的运算数之外,具有“返回 ...的函数 型”的函数定位符将被转换为一个“指向返回的函数的指针型”的表达式。
(2) void
void 表达式(即具有 void 类 型的表达式)的值(不存在)不能以任何方式使用。 无论隐式还是显式的排除 void 的转换均都不能应用于该表达式。如果另一种类型的表达式出现在需要 void 表达式的地方背景中,则表达式
或说明符的值将被假定为不存在。
(3) 指针
void 指针可以被转换为指向任何不完全类型的指针或对象类型的指针。反过来,一个指向任何不完全类型或对象 类型的指针也可以被转换为 一个值为 0 且被转换为 void * 型的整型常量表达式被成为“空指针常量”。如果空指针常量用另一种指针来替代,或 赋值,或与空指针常量之比较等,则空指针常量将被转换为该指针类型。
void 型指针。 在这两种情况下,结果值都必须等于原始指针的值。
74
用户手册 U14872CA1V0UM

第 5 章 运算符与表达式。

本章介绍 C 语言中使用的运算符和表达式。 C 语言支持具有大量用于算术、逻辑和其他运算的运算符。 其丰富的运算符集合还包括那些用于位运算和地址运算
的运算符。
表达式是一个运算符及和一个或多个运算数组成的字符串,或者说是其组合。 运算符定义对运算数执行的操作动 作,比如计算一个值,操作对对象或调用函数的指令,同时产生副生成侧放作用(设计意图之外的结果取出指令后暂不 执行,放在一旁)或这些操作的组合。
下面给出了运算符示例。
#define TRUE 1 #define FALSE 0 #define SIZE 200
void lprintf(char*, int); void putchar(char c);
char mark[SIZE+1]; + ............................................................. 算术运算符
void main(void){ int i,prime,k,count;
count=0; = ............................................................. 赋值运算符
for(i=0;i<=SIZE;i++) ++ ........................................................... 后缀运算符
mark[i]=TRUE; < = .......................................................... 关系运算符
for(i=0;i<=SIZE;i++){ if(mark[i]){
prime=i+i+3; + ............................................ 算术运算符
lprintf("%d",prime);
count++; ++ .......................................... 后缀运算符
if((count%8)==0) == .......................................... 关系运算符
putchar('\n');
for(k=i+prime;k<=SIZE;k+=prime) += ........................ 赋值运算符
mark[k]=FALSE; } }
用户手册 U14872CA1V0UM
75
lprintf(“Total %d\n”, count); loop1: goto loop1; }
lprintf(char *s,int;){ int j; char *ss; j=i; ss=s; }
void puttchar(char c){ char d; d=c; }
第5章 运算符与表达式
76
用户手册 U14872CA1V0UM
第5章 运算符与表达式
5-1 给出了 C 中使用的运算符的计算优先级。
5-1 运算符计算优先级
表达式类型 运算符 结合
后缀表达式
单目表达式
类型转换表达式 (类型)
乘性乘法表达式
加性加法表达式
按位移位表达式
关系表达式
等性表达式
按位与表达式
按位异或表达式
按位或表达式
逻辑与表达式
逻辑或表达式
条件表达式
赋值表达式
逗号表达式
[ ] ( ) . – > ++ – –
++ – – & * + – ~ ! sizeof
* / %
+ –
<< >>
< > <= >=
== !=
&
^
|
&&
| |
? :
= *= /= %= += –= <<= >>= &= ^= | =
,
方向
优先级
最高
最低
同一行内的操作运算符具有相同的优先级。
结合方向列中的箭头()表示,当一个表达式包含两个或多个具有相同优先级的运算符时,则运算按箭头 (从左向右)或(从右向左)指示的方向进行组合然后运算。
用户手册 U14872CA1V0UM
77
第5章 运算符与表达式

5.1 基本表达式

基本表达式包括以下几种。
声明为一个对象或函数的标识符 (标识符基本表达式)
常量(常量基本表达式)
字符串文字(常量基本表达式)
括在圆括号中的表达式 (括号表达式)
如果声明了一个对象,则成为基本表达式的标识符是表达式的一个左侧值;如果声明了一个函数,则成为基本表达式
的标识符是一个函数定位符。 正如在第 2.4 节 常量中介绍的那样,常量的数据类型取决于为该常量指定的值。 字符 串文字成为具有第 2.5 节 字符串文字中介绍的数据类型的左侧值,其具有的数据类型在第 2.5 节 字符串文字中详细介 绍。

5.2 后缀运算符

后缀运算符是一个出现在对象或函数的后面的运算符。 下面几页中将介绍基本表达式。
78
用户手册 U14872CA1V0UM
第5章 运算符与表达式
(1) 下标运算符
后缀运算符 [ ] 下标运算符
功能
下标说明符[ ]指定或引用一个数组对象的一某个元素。 对数组或表达式“E1 [E2]”的评估求解就是把它当成
“(*(E1+(E2)))”来进行的。 换句话说,E1 的值是一个指向数组的第一个元素的指针,E2(假设它是整数)则指示 E1(从 0 开始计数)的第 E2 个元素。 对于多维数组,下标运算符的数量必须与维数相等。
在下面的例子中,x 是一个 3*5 的 int 型数组。 换句话说,x 是一个具有三个成员的数组,每个成员由五个 int 型 元素组成。
int x[3][5];
可以通过连接下标运算符来指定一个多维数组。 假设 E 是一个由 i*j*...*k 组成的 n 维数组(其中 n   2),则可 以使用 n 个下标运算符来指定该数组。 在这种情况下,E 成为一个指向由 j*...*k 组成的(n – 1)维数组的指 针。,数组元素由 j*...*k 组成。
语法
后缀表达式[下标表达式]
后缀表达式必须有一个“.... 指针指向对象的....指针”。 数组的下标表达式必须使用整型数据来指定。 表达式的结
果将变成“.....”型。
用户手册 U14872CA1V0UM
79
第5章 运算符与表达式
(2) 函数调用
后缀运算符 ( ) 函数调用
功能
后缀运算符()用于调用一个函数。 待调用的函数用后缀表达式来指定,传递给函数的参数在括号()中指定。 与该函数相关的描述包括函数原型声明、函数定义(函数体)及函数调用。 函数原型声明指定函数的返回的值、 函数的参数类型及存储类型。 如果在函数调用中没有引用函数原型声明没有在函数调用中被引用,则各个参数将使用一个通用整数来扩展各个参 数。 这称为“默认实参扩展”。 执行函数原型声明可以避免了默认实参扩展,并能检测类型错误、参数数量是否匹 配及返回值的类型。 如果调用一个的既无存储类说明又无数据类型说明的函数既未指定存储类型也没有说明数据类型,如“标识符 ();”,则将被解释为调用一个具有外部对象的函数,并返回一个没有参数信息的 int 型值。 换句话说,将隐含 地进行以下的声明将会隐含进行。
extern int identifier ();
语法
后缀表达式(变量表达式列表);
[函数调用示例]
int func(char,int); /* 函数原型声明 */
char a; int b,ret; void main(void){ ret=func(a,b); /* 函数调用 */
} int func(char c, int i){ /* 函数定义 */
. . . return i; }
可以使用该运算符,调用的函数其一个返回值必须是非数组型对象非数组类型的函数。 后缀表达式必须有一个指 向该函数的指针类型。
在包括原型的函数调用时,调用的参数的类型必须是能够赋值兼容定义中给对应的参数的类型。 参数的数量也必 须一致。
80
用户手册 U14872CA1V0UM
第5章 运算符与表达式
(3) 结构体与共用体成员
后缀运算符 . ->
<1> . (点)运算符
功能
. (点)运算符(也称为成员运算符)指定一个结构体或共用体中的某个单个成员。 后缀表达式是指定的结构体 或共用体的名称,标识符是成员的名称。
语法
后缀表达式 . 标识符
<2> -> (箭头)运算符
功能
->(箭头)运算符(也称为间接成员运算符)指定一个结构体或共用体的某个单个成员。 后缀表达式是指向特指 定的结构体或共用体的指针的名称,标识符是成员的名称。
语法
后缀表达式 -> 标识符
用户手册 U14872CA1V0UM
81
第5章 运算符与表达式
后缀运算符 . ->
[‘.’‘->’运算符示例]
#include <stdlib.h>
union{ struct{ int type; }n; struct{ int type; int intnode; }ni; struct { int type; struct{ long longnode; }*nl_p; }nl; }u;
void func(void){ u.nl.type=1; u.nl.nl_p->longnode=-31415L; /*...*/ if(u.n.type==1) u.nl.nl_p->longnode=labs(u.nl.nl_p->longnode); }
82
用户手册 U14872CA1V0UM
第5章 运算符与表达式
(4) 后缀自增/自减运算符
后缀运算符 ++ – –
<1> 后缀自增运算符
功能
后缀自增运算符将对象的值增加 1。 这种自增运算在执行时会根据考虑到了对象的数据类型而自动调整。
语法
后缀表达式 ++
<2> 后缀自减运算符
功能
后缀自减运算符将对象的值减去 1。 这种自减运算在执行时会根据对象的数据类型而自动调整考虑到了对象的数 据类型。
语法
后缀表达式– –
后缀自增或自减运算符的运算数必须是一个可更改的左值(说明的或未说隐含明的)。
用户手册 U14872CA1V0UM
83
第5章 运算符与表达式

5.3 单目运算符

单目运算符执行会对一个对象或参数(即运算数)的进行运算。支持 有以下的单目运算符有以下几种可供使用。
前缀自增和自减运算符
++ ––
地址和间接运算符
& *
单目算术运算符
+ – ~ !
sizeof 运算符
sizeof
下面几页中将介绍单目运算符将在随后几页中详细介绍。
84
用户手册 U14872CA1V0UM
第5章 运算符与表达式
(1) 前缀自增/自减运算符
单目运算符 ++ – –
<1> 前缀自增运算符
功能
前缀自增运算符会将对象的值增加 1。 前缀自增运算符的表达式“++E”将产生的效果与以下表达式相同的结果。
E = E + 1
E += 1
语法
++前缀表达式
<2> 前缀自减运算符
功能
前缀自减运算符将对象的值减 1。 前缀自减运算符的表达式“– –E”将产生的效果与以下表达式相同的结果:
E = E – 1
E –= 1
语法
单目表达式
用户手册 U14872CA1V0UM
85
第5章 运算符与表达式
(2) 地址和间接运算符
单目运算符 & *
<1> 单目 &运算符
功能
单目 & 运算符返回一个指定的对象的指针(即,其后所描述的变量的地址)。
语法
& 运算数
<2> 单目 * 运算符
功能
单目 * 运算符返回指特定的指针所指示的值(即,取其后描述的变量的实际值,并将该值用作内存中信息的地 址)。
语法
* 运算数
单目 & 运算符的运算数必须是一个左值,该左值所引用的对象不支持一个未使用寄存器存储类说明符进行声明的对 象。 函数定位符及位段域均不能用作该单目运算符的运算数。 单目 * 运算符的运算数必须有一个指针类型。
86
用户手册 U14872CA1V0UM
第5章 运算符与表达式
(3) 单目算术运算符(+ – ~ !
单目运算符 + – ~ !
功能
+ (单目加)运算符对其运算数执行正整型提升。 (单目减)运算符对其运算数执行负整型提升。 ~(否定符号)运算符是一个按位求补的运算符,它将运算数字节中的所有位取反。
如果运算数是 1,! 非或逻辑取反非运算符返回 0,否则,返回 1。 换句话说,该运算符将每个 0 变为 1,将 1 变0
语法
+ 运算数 运算数 ~ 运算数 ! 运算数
用户手册 U14872CA1V0UM
87
第5章 运算符与表达式
(4) sizeof 运算符
单目运算符 sizeof 运算符
功能
sizeof 运算符以字节为单位返回一个指定的对象所占的大小。 返回值由对象的数据类型控制,但不计算对象本身 的值和此返回值无关。 执行了 sizeof 运算的 unsigned charsigned char 对象(包括其限定的类型)返回的值是 1。 对于一个数组 型对象,返回值是数组中字节的字节总数。 对于一个结构体或共用体对象,结果返回值是对象占有的字节的总 数,其中包括填充邻接对象之间的适当对齐边界所需要的字节。 sizeof 运算结果的类型是整型,其名称是 size_t。 该名称在 <stddef.h> 头文件中有定义。 sizeof 运算符主要用 于分配内存单元,以及与 I/O 系统之间传输数据。
语法
sizeof 单目表达式 sizeof (类型名)
示例
下面的示例通过用一个元素的大小除数组中的总字节数来求得一个数组中包含的元素数。 结果是 5。
int num; char array[]= {0, 1, 2, 3, 4};
void func(void){ num = sizeof array / sizeof array [0]; } char array[]=
注: 一个如果表达式具有函数类型或不完全类型,并且左值及一个引用位段域对象的左值的表达式,则该表达式不能
用作该操作数符的运算数。
88
用户手册 U14872CA1V0UM
第5章 运算符与表达式

5.4 类型转换运算符

类型转换运算符是一个特殊的运算符,它强制将一个数据从某种类型转换为另一个种数据类型。 类型转换运算符主 要用于转换指针类型。
类型转换运算符 (类型名)
功能
类型转换运算符将另一个对象(或另一个表达式的结果)的数据类型转换为括号()中指定的指定类型。
语法
(类型名)表达式
示例
void func(void){ int val; float f;
f=3.14F; val=(int)f; /* 通过转换 val 变为 3 */ val=*(int *)0x10000; /* 转换常量 */
}
用户手册 U14872CA1V0UM
89
第5章 运算符与表达式

5.5 算术运算符

算术运算符分为乘性法运算符和加法性运算符,其中乘性乘法运算符的优先级高于加性加法。 乘性乘法运算符可以
求两个运算数的乘积、商及余数。 加性加法运算符求两个运算数的和与差。
乘性乘法运算符 * / %
加性加法运算符 +
5-2 除号/求余运算结果符号
a/b
+ + – + + +
a
– – +
备注 ab 表示运算数。
除法是对两个通过正常的算术转换对两个去掉符号(如果有)的整数进行的,必要时,结果会尽量向 0 的方向进行靠 拢截取。 同样,求余或取模除运算是对两个通过正常的算术转换去掉符号(如果有)的整数进行的,这两个整数的符 号(如果有)会通过正常的算术转换去掉。 表 5-2 分别以符号给出了两个运算数进行除法和求余运算的计算结果。 下 面介绍乘性乘法和加性加法运算符。 解释语法中的 E1 和 E2 表示运算数或表达式。
b b
+ –
a % b
a
– – –
+ –
90
用户手册 U14872CA1V0UM
第5章 运算符与表达式
(1) 乘性乘法运算符
乘性乘法运算符 * / %
<1> * 运算符
功能
* 运算符对两个运算数执行正通常的乘法操作,并返回乘积。
语法
E1 * E2
<2> / 运算符
功能
/ 运算符对两个运算数执行通常的除法,并返回商。
语法
E1 / E2
<3> % 运算符
功能
% 运算符对两个运算数执行求余(或取模除)运算,并返回结果中的余数。
语法
E1 % E2
用户手册 U14872CA1V0UM
91
第5章 运算符与表达式
(2) 加性加法运算符
加性加法运算符 +
<1> + 运算符
功能
+ 运算符对两个运算数执行加法运算,并返回两个数的和。
语法
E1 + E2
<2> – 运算符
功能
– 运算符对两个运算数执行减法运算,并返回两个数的差(第一个运算数减去第二个运算数)。
语法
E1 – E2
92
用户手册 U14872CA1V0UM
第5章 运算符与表达式

5.6 按逐位移位运算符

移位运算符将第一个(左侧)运算数按运算符指定的方向(向左或向右)移动第二个运算数指定位数,移动多少次由
第二个运算数决定。 共有以下两个移位运算符。
移位运算符 << >>
5-3 移位运算
a<<b
a
该表说明了当右侧运算操作数大于左操作侧运算数中的位数,或当移位运算时发生溢出时的情况。 如果右侧运算数右操作数是一个负数,则其值将被作为一个无符号正数处理。
备注 ab 表示运算数。
下面几页中将介绍移位运算符。 E1 E2 表示运算数或表达式。
a>>b
b
+ 0 + 0
– 0
a
b
– –1
用户手册 U14872CA1V0UM
93
第5章 运算符与表达式
移位运算符 << >>
<1> 左移运算符(<<
功能
<< 运算符将左侧运算操作数向左移动,右侧运算操作数指定移动的位数,并将空出的位置填 0 如果在“E1 << E2”中左操作侧运算数 E1 是有一个无符号类型,则结果的值就是将变为 E1 乘以 2 E2 次幂得到的值。
语法
E1 << E2
<2> 右移运算符((>>
功能
>> 运算符将左侧运算数左操作数向右移动,右侧运算数右操作数指定移动的位数。 如果左侧运算数左操作数是 无符号型的,则空出的位将被填充 0(逻辑移位)。 如果左侧运算数左操作数是带符号型的,则将符号位填充到 移动后空出的位中。 如果在“E1 >> E”中左侧运算数左操作数 E1 是无符号,或 E1 是带符号型的且是一个非负值,则结果的值就是将变 为 E1 除以 2 的 E2 次幂得到的值。
语法
E1 >> E2
94
用户手册 U14872CA1V0UM
第5章 运算符与表达式

5.7 关系运算符

有两种运算符可以表示两个运算数之间的关系:“关系运算符”和“等性运算符等式运算符”。 关系运算符表示两个运算数之间的值的关系,如大于、小于。 等性运算符等式运算符表示两个运算数是否相等。 关系运算符和等性运算符等式运算符如下所示。
关系运算符 < > <= >=
等性运算符等式运算符 = = !=
关系运算符所比较的两个指针之间的值的关系大小,由指针指示的对象在地址空间中的相对位置来决定。 在本编译程序编译器中,如果指定的关系是真,则关系运算符和等性运算符等式运算符产生一个“1”;如果为假,则
产生一个“0”。 得到的结果是 int 型的。
下面几页中将介绍关系运算符和等性运算符等式运算符。 解释语法其中的 E1 和 E2 表示运算数或表达式。
用户手册 U14872CA1V0UM
95
第5章 运算符与表达式
(1) 关系运算符
关系运算符 < > <= >=
<1> < (小于)运算符
功能
如果左侧运算数左操作数小于右侧运算数右操作数, < 运算符返回 1;否则,返回 0。
语法
E1 < E2
<2> > 大于)运算符
功能
如果左侧运算数左操作数大于右侧运算数右操作数, > 运算符返回 1;否则,返回 0。
语法
E1 > E2
<3> <= (小于或等于)运算符
功能
如果左侧运算数左操作数小于或等于右侧运算数右操作数, <= 运算符返回 1;否则,返回 0。
语法
E1 <= E2
96
用户手册 U14872CA1V0UM
第5章 运算符与表达式
关系运算符 < > <= >=
<4> >=(大于或等于)运算符
功能
如果左侧运算数左操作数大于或等于右侧运算数右操作数, >= 运算符返回 1;否则,返回 0。
语法
E1 >= E2
用户手册 U14872CA1V0UM
97
第5章 运算符与表达式
(2) 等性运算符等式运算符
等性运算符等式运算符 = = !=
<1> = = (等于) 运算符
功能
如果两个运算数相等, = = 运算符返回 1;否则,返回 0。
语法
E1 == E2
<2> !=(不等于) 运算符
功能
如果两个运算数不相等, != 运算符返回 1;否则,返回 0。
语法
E1 != E2
98
用户手册 U14872CA1V0UM
第5章 运算符与表达式

5.8 按位逻辑运算符

按位逻辑运算符以位为单位,对对象的值会被执行指定的逻辑运算。 按位逻辑表达式包括按位与(&)、按位异或
^)及按位或( | )。
每个逻辑运算由下面的运算符来说明。
按位与运算符 &
按位异或运算符 ^
按位或运算符 |
下面几页中将介绍按位逻辑运算符。 解释其语法中的 E1 和 E2 表示运算数或表达式。
用户手册 U14872CA1V0UM
99
Loading...