• 検索結果がありません。

計算機言語 I 第 3 回 演算 , 型

N/A
N/A
Protected

Academic year: 2021

シェア "計算機言語 I 第 3 回 演算 , 型"

Copied!
4
0
0

読み込み中.... (全文を見る)

全文

(1)

計算機言語 I 第 3 回 演算 , 型

この講義資料は, 次の場所に置きましたので, Web ブラウザで読んでください. http://www.math.u-ryukyu.ac.jp/~suga/gengo/2018-1/03.pdf

1 演算

コンピュータにやらせる仕事は,本質的に「データ処理」で,様々なデータを「計算により」変形していきま . このデータの変形が,「演算(operation)」と呼ばれるものです.

最も原始的なレベル(CPU内部)では, 演算はスイッチのon–off となっていますが,そのまま(すなわち機 械語)では人間にとって大変です. 従って, 簡単な計算では,通常の算術で用いられる記号やそれに類する記号 を使って演算を記述できるようにするのは, プログラミング言語の基本です.

前回,変数の型が演算を規定すると言う話をしましたが, それを少し詳しくみます.

1.1 4則演算と剰余

int型の変数に対しては,加減乗除の4則演算および剰余計算ができます. それぞれの記号が, +, -, *, / および%,これはawkと同じです. これらの演算は, 2つのものから新な1つのものを作り出すので,2 演算」と呼ばれます. Cでは, 2項演算以外に単項演算, 3項演算があります.

上で出て来た演算の記号, +, -, *, /, %を演算子(operatorの日本語訳, operator は数学では作用素と 訳すことが多い.)といいます. 演算子を用いて計算される数を被演算子(あるいは,日本語に訳さずにオペラン (operand))といいます.

int 型の除算と剰余に対する注意

int型の割り算の結果は,何もしなければint 5÷3をどう計算すべきか,すなわち,5÷3 = 1あまり2 なのか,5÷3 = 1.666. . .」とすべきなのかは, 文脈によります. 従って,割り算をどう実装するかは, そのプログラミング言語の設計思想が反映されます. Cでは,特別なことをしなければ, 5/3 = 1と計算 されます.

負の整数の割算と剰余の値は処理系依存(p. 24, Column 2-1) (5)÷3 =1余り2」なのか「(5)÷3 =

2余り1」なのかは,悩ましい問題です. 数学では, 後者を選択することが多いですが, 一般的には特 に決まりはなさそうです. Cでの負の整数における割算および剰余の計算結果は, 言語仕様には規定さ

1

(2)

れていません. これは, コンパイラの作成者が独自にその結果の値を定義すると言うことを意味します. つまり,同じコンピュータやOSを使ったとしても,コンパイラ作成者が違えば,結果も異なる可能性が あるのです.

 上の場合は,分子が負の整数で不定性は多くないのですが,分母が負の整数になると,余りをどう捉え るべきかと言う問題も出てきます.

 これらのことから,負の整数での割算を利用するときには,注意が必要です.

 特に,分母に負の整数が現れるときには,そのようなプログラムを組む必要が出てきた時点で, プログ ラムの設計を見直すべきです.

上記のことを踏まえて,教科書p. 22 List 2-1, p. 24 List 2-2, p.24 List 2-3をコンパイル実行してくださ . 通常の数式の 4則演算の優先順位は,通常ほ数学の計算ルールに一致します. 括弧()も利用でき,これも 数学の計算ルールに一致します. ただし,{ }[ ]は数式の括弧としては使えません. これらは, Cにおい ては別の意味を持ちます. 実行においては, 負の数を入力した結果をみてください.

教科書p.23 にあるように, printf%を出力する(%をエスケープする)方法は, %%を利用します.

1.2 単項演算子

オペランド(非演算子)1つの演算子を単項演算子と言います. これまでに, scanfのところでアドレス演

算子&が現れました. int型の変数に関しては, これ以外に,符号を変える演算子が単項演算子としてあり

ます. int型変数に対して, –a aの符号を変化させます(下に述べるfloat, double型でも同じです). 項演算子+も利用できます. すなわち, +aは文法的にはエラーではありません. しかし, 何も値を変化させな いので,使うことがありません.

1.3 代入演算子, , 式文

代入に利用する=も演算子です. lhs = rhs ;

と言う文では,左辺のlhs の値が右辺のrhsの値に変化するからです.

プログラムの記述に際して,演算子などを用いて,なにがしかの値を計算する内容の指示を「式」と言います. プログラムの記述において, 1つの単純な動作の指示を文というのは,以前に述べたとおりです. Cでは文の 終わりを,セミコロン;で表します. 式で1つの文が形成されているとき,これを「式文」と言います.

プログラムの記述では,単純な 1つの指示からなる文を積み重ねて,処理を記述していきます. 1 つの文に 複数の動作を記述することも, ある部分ではできます. しかし,多くの場合,そのような記述はプログラムの可 読性を低下させます. 現在では特別な場合を除いて, 1つの文に複数の指示を記述するのは,あまり推奨されて いません. (プログラムを読むのは,コンパイラだけではなく,人間も読む.)

2

(3)

2 型

以前の講義で, 変数宣言に型を指定する主な理由が,実行の際に必要なメモリ(1次記憶)の量を知るためで あると述べました. int型が宣言された変数を使う際には,その値を保持するのに必要なメモリが実行時に確保 されます. このように確保されたメモリを, オブジェクトととも言います.

さて, 整数型で全ての処理を書くのは大変ですので,もう少し現実の世界の実数に近づけた型として, 浮動小 数点型があります. Cでは,浮動小数点型として, float (単精度)double (倍精度)2種類があります. の講義では, doubleを用いることにします. double型で宣言された変数は, 実行時のdouble型を保持するの に必要なメモリを確保するような命令が,コンパイラによって作成されます.

int, double型ともに,確保されるメモリの量は処理系によって完全に決まっています. 数学のように無

限にたくさんの値をとることはできず, ある有限の範囲(あるいは有限の有効桁数)での計算しかできません. その範囲については,後の講義で述べます.

float double の違いは, 有効数字と扱える数の範囲の違いです. 基本的に, ほとんどの処理系で,

IEEE(The Institute of Electrical and Electronics Engineers, Inc.) が定めた規格を使っており, float 32 bit, double 64 bitです. Cの開発当時は, CPU16 bit でメモリも少なく, doubleを使う のは特別な場合だったのですが, 今では, CPU64 bit でメモリも豊富にありますので, floatを使う

(例えば, GPGPUを用いた数値計算では, float の方が多い?)が特別になりました.

int型では,割算で余りが切り捨てられますが, double 型では小数点以下まで計算してくれます.

「型が演算を決める」という目で見ると, double型では剰余の演算子%は意味を持たないので,この演算を することができません. (実は, Cの数学関数ライブラリにfmodと言う浮動小数点数の余りを計算するライブ ラリ関数があります. 商を整数の範囲に限定して残りを余りとするようですが,使い道がわからない...)

教科書p. 28 list 2-5, p.29 List 2-6をコンパイル,実行してください. printfdouble型の型指定の方法は, %fです.

scanfでのdouble型指定は %lfです. この辺の不統一感は,如何ともし難いのですが, そのように決まった

ことなので,受け入れてください.

これを踏まえて, p.31 list 2-7 をコンパイル実行してください.

2.1 型の格上げと型変換

int型でもdouble 型でも4則演算ができます. では, int+ double型の計算はどうなるのかという問題

が生じます. 実際には,このような計算は, int型をdouble 型に変換して計算が実行され, double 型の結果が 得られます. 2回の講義で, 4つの基本型があると述べましたが,それらには,次の順序が付いています.

char<int<float<double

この意味は,異なる型での演算を行なった場合,右側にある型であると変換されて(格上げされて),その型で結 果が出て来るという意味です.

上のような,自動的な型変換以外に,明示的に型を変換することもできます(キャストcastするという). の方法は,

3

(4)

(キャストする先の型) ;

という形式をとり, 型の名前を括弧で囲みます.

上の不等号で,右側方向へのキャストは, 情報量が減ることはほとんどありません(全くないわけではない.

intfloat では情報を捨てる可能性がかなりある.). しかし, 左側方向へもキャストすることができ,その際

には,一般的に情報量が減ります. 例えば2.3を整数型にキャストすると2になります. したがって,左側への キャストは注意をする必要があります.

また,基本型での代入文では,左辺の変数型に右辺の値が自動的にキャストされます. int a = 2.3 ;

のような文で, a2が代入されたのは,以前のレポート問題で見たとおりです. p.33 List 2-8, p.34 List 2-9, p.35 List 2-10をコンパイルして実行してください.

printfの出力書式設定(出力桁数の指定方法)については, p.36, p.37の内容を必要な時に参照することにし

ます. 興味のある人は,読んでおいてください. レポート問題

1. この講義で用いている処理系において,負の整数同士の割り算及び剰余の計算はどのような値を返している かを調べよ. そのためのプログラムを書き,その結果とともにレポートする. プログラムでは,括弧を利用して 負の数の計算を実行していることが,明示的にわかるようにすること.

件名: 負の数の割り算 2. 教科書 p. 35演習3-5.

件名: enshu2-5

レポートの締め切りは, 57

4

参照

関連したドキュメント

前章 / 節からの流れで、計算可能な関数のもつ性質を抽象的に捉えることから始めよう。話を 単純にするために、以下では次のような型のプログラム を考える。 は部分関数 (

これは基礎論的研究に端を発しつつ、計算機科学寄りの論理学の中で発展してきたもので ある。広義の構成主義者は、哲学思想や基礎論的な立場に縛られず、それどころかいわゆ

テューリングは、数学者が紙と鉛筆を用いて計算を行う過程を極限まで抽象化することに よりテューリング機械の定義に到達した。

チューリング機械の原論文 [14]

(問5-3)検体検査管理加算に係る機能評価係数Ⅰは検体検査を実施していない月も医療機関別係数に合算することができる か。

⑥ニューマチックケーソン 職種 設計計画 設計計算 設計図 数量計算 照査 報告書作成 合計.. 設計計画 設計計算 設計図 数量計算

 当図書室は、専門図書館として数学、応用数学、計算機科学、理論物理学の分野の文

、肩 かた 深 ふかさ を掛け合わせて、ある定数で 割り、積石数を算出する近似計算法が 使われるようになりました。この定数は船