丁度、講義の前に別授業の課題に取り組んでいる学生を見ていたら、 次週に説明を行おうと思っていたN進数、小数点を含む2進数であった。 丁度、「計算機構成論」の補数、「数値計算」の小数点を含む2進数の講義で、 いつもになく、内容と説明時期が重複している…(^_^;
関数の値渡し
関数との引数の値渡しについて解説。 C言語では基本の値渡しメカニズムしかない。 引数で副作用(side effect)を返したい場合は、その代用としてポインタ渡しを利用する。 また、配列が引数の場合、値渡しのためのコピーを最小限とするため、 配列先頭アドレスによるポインタ渡しで行われることを説明する。
// 値渡し void foo( int x ) { x++ ; printf( "%d¥n" , x ) ; } void main() { int a = 123 ; foo( a ) ; // 124 foo( a ) ; // 124 } // ポインタ渡し void foo( int* px ) { (*px)++ ; printf( "%d¥n" , *px ) ; } void main() { int a = 123 ; foo( &a ) ; // 124 foo( &a ) ; // 125 } // 参照渡し(C++の新しい文法で紹介のみ) void foo( int &x ) { x++ ; printf( "%d¥n" , x ) ; } void main() { int a = 123 ; foo( a ) ; // 124 foo( a ) ; // 125 } // 配列でのポインタ渡し void foo( int x[] ) { x[0]++ ; printf( "%d¥n" , x[0] ) ; } void main() { int a[1] = { 123 } ; foo( a ) ; // 124 foo( a ) ; // 125 }
整数型の数値範囲
整数型などの数値範囲について説明を行うために、2の補数表現を復習したあと、 数値の範囲について説明する。
type | range | unsigned | signed --------------+-----------+----------+--------------- char | 8bit | 0..255 | -128..127 short int | 16bit | 0..65535 | -32768..32767 int | 32bit | 0..2^32-1| -2^31..2^31-1 long int | ?32bit? | | long long int | gcc 64bit | 0..2^64-1| -2^63..2^63-1
数値範囲の大まかな計算のための2つの方法として、 や、 10進数での桁数の概算のために、 より、 といった計算を行う方法について説明。
次週は、16bitコンピュータで int が簡単に桁あふれする問題や、 2038年問題や2004年問題などを解説する予定。