★目次
◎あいまいな仕様,環境依存……つまずきやすい場所を徹底解説
☆信頼性&再利用性を高めるC言語プログラミング
●第1章 整数型
1.値の範囲
整数型の値の範囲は曖昧である
2.負の値の表現形式
整数型の負の値は表現形式が規定されていない
3.代入規則
代入の規則は代入先の型で変わる
4.符号反転
符号なし整数型を符号反転すると結果は必ず最大値+1の剰余になる
5.整数の格上げ
char型やshort型を使っても「整数の格上げ」でint型に拡張されてしまう
6.算術変換規則
int型の精度によって結果が変わる整数型の算術変換規則
7.整数定数
整数定数の型の割り当てと接尾子
●第2章 浮動小数点型
8.内部表現
浮動小数点型には内部表現の規定がない
9.誤差
誤差により値を正確に表現できない場合がある
10.性能
浮動小数点型を高速・高効率に演算する方法はマイコンごとに異なる
11.精度
適切な精度で演算しないと性能が悪くなる
●第3章 派生型
12.typedef
難しい配列やポインタはtypedefで分かりやすくなる
13.構造体
マイコンで構造体を使うときの作法とテクニック
14.共用体
共用体は適正に利用すればメモリ量の削減に効果を発揮する
15.ビット・フィールド
文法も曖昧だが…周辺機能の制御に向く
●第4章 演算子
16.演算子の小括弧
演算順を決めるものとは別物!演算子の小括弧は「関数呼び出し」に使う
17.添字演算子と間接演算子
添字演算子[ ]と間接演算子*…実は全く同じ意味
18.後置インクリメント(デクリメント)
優先順位と演算タイミングを別々に考えるべし
19.キャスト演算子
実はそれほど必要ではない
20.汎用ポインタ
便利なポインタ型だが…
21.乗法演算子と加法演算子
整数型だと数学の交換法則は成り立たない
22.乗除算の仕様
C言語とマイコンとでは異なる
23.加法演算子による演算
ポインタ型と整数型の演算に使うと,演算結果はポインタ型になる
24.シフト演算子
制約とダイナミック・シフト命令の有無に注意
25.関係演算子
比較結果を利用して条件分岐を効率よく実行できる場合もある
26.等値演算子
ゼロとの比較をする場合は注意が必要
27.ビットごとの論理演算子
意外と優先順位が低い
28.論理演算子
副作用を伴う式は使用禁止
29.条件演算子
if文と使い方が異なることに注意
30.カンマ演算子
プログラムを効率的に記述できる
●第5章 最適化
31.実行速度と使用メモリ量
トレードオフの関係…事前に処理系の設定も確認しよう
32.最適化
処理系が最適化で行うこと
33.最適化の抑止①…アクセス・サイズ
アクセス・サイズを厳守する方法
34.最適化の抑止②…周辺機能レジスタ
周辺機能レジスタへの書き込み/読み込み処理
35.変数に対する最適化の抑止①…局所変数
局所変数は積極的に最適化を実施する
36.変数に対する最適化の抑止②…デバッグ時
変数の値が参照できないときは一時的に指定する
37.変数に対する最適化の抑止③…大域変数
割り込みとの絡みで指定する・しないを決定する
●第6章 静的変数領域の削減
38.static記憶クラス
staticには隠蔽と静的の2つの意味がある
39.大域変数に指定するstatic記憶クラス
大域変数に対して使うstatic記憶クラスは変数の破損を防ぐ隠蔽の意味を持つ
40.局所変数に指定するstatic記憶クラス
局所変数に対して使うstatic記憶クラスは静的の意味で使う
41.動的変数と静的変数の違い
番地,初期値の設定タイミング,初期状態をプログラムで見てみる
42.初期値の有無
静的変数の取り扱いは初期値の有無で変わる
43.削減方法①…初期値がゼロの場合
初期値がゼロなら記述しない
44.削減方法②…初期値がある場合
初期値が必要なら記述する
45.削減方法③…初期値を変更しない場合
const型修飾子を指定する
●第7章 スタック・サイズの算出
46.スタック領域の確保
処理系によって適当に確保される
47.スタック領域の使われ方
関数呼び出し時にどのように使われるのか見てみる
48.スタック・サイズの計算方法
まずは手動で計算する
49.ツールでスタック・サイズを計算する
ツールの機能で自動的に計算する
●第8章 動的スタック領域の削減
50.スタック領域の減らし方
ネスト・レベルを減らすのが最優先
51.関数の引数の個数
汎用レジスタに格納できる個数に抑えよう
52.局所変数の削減
全ての処理系に共通の内容はない
53.CPU内部レジスタの退避領域
退避領域を削減する
●付録A リファレンス
●付録B 文法理解度クイズ
本書は月刊『Interface』誌2021年1月号~2024年6月号に掲載された,
連載「マイコンC言語転ばぬ先のつえ」の内容を加筆,再編集したものです.