Microsoft PowerPoint - CproNt05.ppt [互換モード]

Similar documents
Microsoft PowerPoint - CproNt02.ppt [互換モード]

プログラミング実習I

Microsoft Word - no02.doc

JavaプログラミングⅠ

gengo1-2

JavaプログラミングⅠ

char int float double の変数型はそれぞれ 文字あるいは小さな整数 整数 実数 より精度の高い ( 数値のより大きい より小さい ) 実数 を扱う時に用いる 備考 : 基本型の説明に示した 浮動小数点 とは数値を指数表現で表す方法である 例えば は指数表現で 3 書く

Microsoft PowerPoint - 3.ppt [互換モード]

Microsoft PowerPoint - 4.ppt [互換モード]

PowerPoint プレゼンテーション

スライド 1

第1回 プログラミング演習3 センサーアプリケーション

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

Microsoft Word - Cプログラミング演習(11)

Microsoft PowerPoint - 説明2_演算と型(C_guide2)【2015新教材対応確認済み】.pptx

第2回講義:まとめ

Taro-ポインタ変数Ⅰ(公開版).j

数値計算

Microsoft Word - 3new.doc

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

Microsoft PowerPoint - CproNt11.ppt [互換モード]

Microsoft Word - Cプログラミング演習(1)_2012

Microsoft PowerPoint - 11.ppt [互換モード]

PowerPoint プレゼンテーション

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

Microsoft PowerPoint - 13th.ppt [互換モード]

kiso2-09.key

解答編 第 7 章実数型の計算と標準数学関数 演習問題 7.1 文法事項 1 ) 暗黙の型変換とは何か答えなさい 代入演算子 (=) や算術演算子 (+,-,*,/,%) では 2 つの演算項のデータ型が揃っている事が必要です 2 つの演算項のデータ型が異なる場合 可能ならば 演算項のデータ型を変換

PowerPoint Presentation

<4D F736F F D20438CBE8CEA8D758DC F0939A82C282AB2E646F63>

* ライブラリ関数 islower(),toupper() を使ったプログラム 1 /* 2 Program : trupper.c 3 Student-ID : K 4 Author : TOUME, Kouta 5 Comments : Used Library function i

System.out.println("char : " + (int)character.min_value + "~" + (int)character.max_value); System.out.println("float : " + Float.MIN_VALUE + "~" + Flo

PowerPoint プレゼンテーション

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

Java講座

ソフトウェア基礎技術研修

プログラミング基礎

gengo1-8

ゲームエンジンの構成要素

gengo1-11

1. 関数 scanf() 関数 printf() は変数の値を画面に表示しますが それに対し関数 scanf() はキーボードで入力した値を変数に代入します この関数を活用することで対話式 ( ユーザーの操作に応じて処理を行う ) プログラムを作ることができるようになります 整数の和

Microsoft Word - Cプログラミング演習(12)

Microsoft PowerPoint - prog06.ppt

JavaScriptプログラミング入門 2.JavaScriptの概要

Microsoft Word - Cプログラミング演習(3)

Microsoft PowerPoint ppt

C言語入門

02: 変数と標準入出力

情報処理Ⅰ演習

Report#2.docx

C プログラミング 1( 再 ) 第 4 回 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ 1

講習No.1

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

02: 変数と標準入出力

PowerPoint Presentation

02: 変数と標準入出力

本サンプル問題の著作権は日本商工会議所に帰属します また 本サンプル問題の無断転載 無断営利利用を厳禁します 本サンプル問題の内容や解答等に関するお問 い合わせは 受け付けておりませんので ご了承ください 日商プログラミング検定 STANDARD(C 言語 ) サンプル問題 知識科目 第 1 問 (

Microsoft PowerPoint - C1(演算と変数).ppt

Taro-ビット処理(公開版).jtd

講習No.9

講習No.12

Microsoft PowerPoint - C_Programming(3).pptx

Microsoft Word - no202.docx

Microsoft PowerPoint - 7.Arithmetic.ppt

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

gengo1-6

Microsoft PowerPoint pptx

Microsoft Word - java a.doc

ポインタ変数

02: 変数と標準入出力

CプログラミングI

Microsoft PowerPoint - prog08.ppt

memo

4 ソフトウェア工学 Software Engineering 抽象データ型 ABSTRACT DATA TYPE データ抽象 (data abstraction) 目的 : データ構造を ( 実装に依存せずに ) 抽象的に定義 方法 : データにアクセス (read, write) する関数の仕様

Microsoft PowerPoint - class2-OperatorOverLoad.pptx

プログラミング入門1

02: 変数と標準入出力

Microsoft PowerPoint pptx

MW100 Modbusプロトコルによるデータ通信の設定について

Microsoft PowerPoint pptx

Microsoft Word - VBA基礎(3).docx

02: 変数と標準入出力

物質工学科 田中晋

<4D F736F F D20438CBE8CEA8D758DC03389F0939A82C282AB2E646F63>

Microsoft PowerPoint - 第1回目復習_pdf用.ppt [互換モード]

プログラミング実習I

Microsoft Word - no103.docx

18 C ( ) hello world.c 1 #include <stdio.h> 2 3 main() 4 { 5 printf("hello World\n"); 6 } [ ] [ ] #include <stdio.h> % cc hello_world.c %./a.o

memo

02: 変数と標準入出力

Microsoft Word - report#8.docx

Microsoft Word - Cプログラミング演習(10)

C 言語第 3 回 2 a と b? 関係演算子 a と b の関係 関係演算子 等しい a==b 等しくない a!=b より大きい a>b 以上 a>=b より小さい a<b 以下 a<=b 状態 真偽 値 条件が満たされた場合 TRUE( 真 ) 1(0 以外 ) 条件が満たされなかった場合 F

02: 変数と標準入出力

cp-7. 配列

sinfI2005_VBA.doc

Prog1_2nd

4 月 東京都立蔵前工業高等学校平成 30 年度教科 ( 工業 ) 科目 ( プログラミング技術 ) 年間授業計画 教科 :( 工業 ) 科目 :( プログラミング技術 ) 単位数 : 2 単位 対象学年組 :( 第 3 学年電気科 ) 教科担当者 :( 高橋寛 三枝明夫 ) 使用教科書 :( プロ

プログラミング基礎

02: 変数と標準入出力

Transcription:

第 5 章 + 第 14 章演算子 CPro:05-01 第 5 章演算子 I 概要 Cには約 40 種類の演算子がある 算術演算子: ( 基本的なもの ) -( 単項 ) * / + - % ++ -- 優先順位( 評価順序 ) の規則 カッコにより優先順位を変えることができる 算術演算子は代入演算子とあわせて複合演算子となる 算術計算では, 型が異なる場合, 暗黙のキャストが行われる ( 最大化 ) キャスト演算子を用いると明示的に型変換が行える 5.1 算術演算子と代入演算子 05-02 = 代入 ( 左辺と右辺が等しいという意味はない ) 左辺 (L value) = 右辺 (R value) 左辺 : 変数のみ右辺 : 変数 定数 およびそれらの演算を評価した結果 a = 1 + 2; a = a + 1; 以下の例は C 言語では正しくない ( いずれも左辺が変数でない ) 1 = 3 2; 1 + 2 = a; a + b = 3; 1

5.2 優先順位と結合規則 05-03 優先順位 種類 演算子 結合規則 高 関数, 添字, 構造 体メンバ参照, 後置増分 / 減分 ( ) [ ]. -> ++ -- 左 右 前置増分 / 減分, 単項式 ++ --! ~ + - * & sizeof 左 右 キャスト ( 型名 ) 乗除余 * / % 加減 + - シフト << >> 比較 < <= > >= 等値 ==!= ビットAND & 左 右 ビットXOR ^ ビットOR 論理 AND && 論理 OR 条件?: 代入 = += -= *= /= %= 左 右 &= ^= = <<= >>= 低 コンマ, 左 右 単項式とは演算子を適用する項が1つだけの式 :!( 否定 ) ~( 排他的論理和 ) +( 正 ) -( 負 ) *( ポインタ ) &( アド レス ) sizeof 5.3 複合演算子 05-04 a = a + 1; と a += 1; は同じ意味 += ( 加算 ) -= ( 減算 ) *= ( 乗算 ) /= ( 除算 ) %= ( 剰余 ) >>= ( 右シフト ) <<= ( 左シフト ) &= ( ビットごとのAND) ^= ( ビットごとのXOR) = ( ビットごとのOR) 2

5.4 モジュロ演算子 05-05 演算子 : % 整数系のみ対象 a = 5 % 3; 5 3 の余り 5.5 混合演算と型変換 05-06 ランク低ランク高 char < int < long < float < double 式中の最高位ランクの型にあわせて演算が行われ, 評価結果もその型になる ( 最大化 ) 3

test5_1.c 1 main() /* test5_1.c (p.120) */ 2 { 3 char c1, c2, c3; 4 int i1, i2, i3; 5 float f1, f2, f3; 6 7 c1 = 'x'; 8 c2 = 1000; 9 c3 = 6.02e23; 10 printf("%c %c %c n", c1, c2, c3); 11 printf("%d %d %d n", c1, c2, c3); 12 13 i1 ='x'; 14 i2 = 1000; 15 i3 = 6.02e23; 16 printf("%c %c %c n", i1, i2, i3); 17 printf("%d %d %d n", i1, i2, i3); 18 19 f1 ='x'; 20 f2 = 1000; 21 f3 = 6.02e23; CPro:05-07 22 printf("%c %c %c n", f1, f2, f3); 23 printf("%d %d %d n", f1, f2, f3); 24 printf("%f %f %f n", f1, f2, f3); 25 } % cc test5_1.c test5_1.c: In function `main': test5_1.c:8: warning: overflow in implicit constant conversion test5_1.c:9: warning: overflow in implicit constant conversion test5_1.c:15: warning: overflow in implicit constant conversion % a.out x 苙 120-24 127 char に 1000 は入らない 6.02 10 23 も x 苙 120 1000 2147483647 int に 6.02 10 23 は入らない 05-08 0 1079902208 0 実数を整数系に代入するとでたらめな値になる 120.000000 1000.000000 602000017271895229464576.000000 % 4

5.6 キャスト 05-09 明示的に型変換したいとき 書き方 : ( 型名 ) 変数または定数 (double)f (long)i float x, f; f = 3.14159265; x = (int)f ; x は 3 になる ( 切り捨て ) 5.7 インクリメント演算子とデクリメント演算子 05-10 インクリメント : ++ 変数に1 足下結果を変数の値に デクリメント : -- 変数から1 引いた結果を変数の値に a++ ++b c-- --c 前置と後置で意味が違う int x, a = 5; x = a++; x は 5,a は 6 になる ( 評価してから足す ) int x, a = 5; x = ++a; x は 6,a も 6 になる ( 足してから評価する ) 5

test5_2.c 1 main() /* test5_2.c (p.126) */ 2 { 3 int a, b; 4 char c; 5 float e; 6 7 a = b = 2; 8 b += 2; 9 b++; 10 c = 2; 11 b += c; 12 putchar(b); 13 e = (char)b; 14 printf("e is %f n", e); 15 } % cc test5_2.c % a.out ^Ge is 7.000000 ^G(=0x07) のところでピッと鳴る % 05-11 第 14 章演算子 II 05-12 概要 ビット演算子 ビットシフト ビットごとの AND,OR,XOR とマスク キャスト演算子 sizeof 演算子 条件演算子 (3 項演算子 ~?~:~ ) C 言語は比較的低レベルの言語 ビットパターンの操作が可能 プログラムの移植性は低下 6

14.1 ビット演算子 CPro:05-13 整数系のみを対象 printbits 関数 ( 自作 ): 整数をビット (0/1 パターン ) で表示 0~4,-1~-4 のビットパターンを表示 (test14_1.c) 2 進数表示になっている負数は 2 の補数表示 test14_1.c 1 main() /* test14_1.c (p.370) */ 2 { 3 int i; 4 5 for (i = 0; i < 5; i++) { 6 printf("decimal %2d equals binary ", i); 7 printbits(i); 8 } 9 for (i = -1; i > -5; i--) { 10 printf("decimal %2d equals binary ", i); 11 printbits(i); 12 } 13 } 14 % cc test14_1.c /var/tmp//cc1jcfdm.o(.text+0x43): In function `main': : undefined reference to `printbits' /var/tmp//cc1jcfdm.o(.text+0x78): In function `main': : undefined reference to `printbits % 05-14 7

printbits.c 05-15 1 #definebytesize 8 2 3 printbits(intval) 4 int intval; 5 { 6 int i; 7 8 for (i = 0; i < (BYTESIZE * sizeof(int)); i++) { 9 printf("%1d", (intval << i & 1 << BYTESIZE * sizeof(int) - 1)? 1: 0); 10 } 11 putchar(' n'); 12 } % cc test14_1.c printbits.c % a.out Decimal 0 equals binary 00000000000000000000000000000000 Decimal 1 equals binary 00000000000000000000000000000001 Decimal 2 equals binary 00000000000000000000000000000010 Decimal 3 equals binary 00000000000000000000000000000011 Decimal 4 equals binary 00000000000000000000000000000100 Decimal -1 equals binary 11111111111111111111111111111111 Decimal -2 equals binary 11111111111111111111111111111110 Decimal -3 equals binary 11111111111111111111111111111101 Decimal -4 equals binary 11111111111111111111111111111100 % 05-16 8

ビット反転演算子 05-17 演算子 : ~ 0~4 のビットパターンを反転 (test14_2.c) test14_2.c 1 main() /* test14_2.c (p.371) */ 2 { 3 int i; 4 5 for (i = 0; i < 5; i++) { 6 printf("decimal %2d equals binary ", i); 7 printbits(i); 8 printf(" ~ %2d equals binary ", i); 9 printbits(~i); 10 } 11 } % cc test14_2.c printbits.c % a.out Decimal 0 equals binary 00000000000000000000000000000000 ~ 0 equals binary 11111111111111111111111111111111 Decimal 1 equals binary 00000000000000000000000000000001 ~ 1 equals binary 11111111111111111111111111111110 Decimal 2 equals binary 00000000000000000000000000000010 ~ 2 equals binary 11111111111111111111111111111101 Decimal 3 equals binary 00000000000000000000000000000011 ~ 3 equals binary 11111111111111111111111111111100 Decimal 4 equals binary 00000000000000000000000000000100 ~ 4 equals binary 11111111111111111111111111111011 % 05-18 9

ビットシフト演算子 CPro:05-19 演算子 : << 左シフト >> 右シフト 数 123 を 0~31 回左シフト (test14_3.c) test14_3.c 1 main() /* test14_3.c (p.373) */ 2 { 3 int i; 4 5 printf("decimal 123 is binary "); 6 printbits(123); 7 for (i = 0; i < 32; i++) { 8 printf(" %12d 123 << %2d is ", 123 << i, i); 9 printbits(123 << i); 10 } 11 } % cc test14_3.c printbits.c % a.out Decimal 123 is binary 00000000000000000000000001111011 123 123 << 0 is 00000000000000000000000001111011 246 123 << 1 is 00000000000000000000000011110110 492 123 << 2 is 00000000000000000000000111101100 984 123 << 3 is 00000000000000000000001111011000 1968 123 << 4 is 00000000000000000000011110110000 3936 123 << 5 is 00000000000000000000111101100000 7872 123 << 6 is 00000000000000000001111011000000 15744 123 << 7 is 00000000000000000011110110000000 31488 123 << 8 is 00000000000000000111101100000000 62976 123 << 9 is 00000000000000001111011000000000 125952 123 << 10 is 00000000000000011110110000000000 251904 123 << 11 is 00000000000000111101100000000000 503808 123 << 12 is 00000000000001111011000000000000 1007616 123 << 13 is 00000000000011110110000000000000 2015232 123 << 14 is 00000000000111101100000000000000 4030464 123 << 15 is 00000000001111011000000000000000 8060928 123 << 16 is 00000000011110110000000000000000 16121856 123 << 17 is 00000000111101100000000000000000 32243712 123 << 18 is 00000001111011000000000000000000 64487424 123 << 19 is 00000011110110000000000000000000 05-20 10

% 128974848 123 << 20 is 00000111101100000000000000000000 257949696 123 << 21 is 00001111011000000000000000000000 515899392 123 << 22 is 00011110110000000000000000000000 1031798784 123 << 23 is 00111101100000000000000000000000 2063597568 123 << 24 is 01111011000000000000000000000000-167772160 123 << 25 is 11110110000000000000000000000000-335544320 123 << 26 is 11101100000000000000000000000000-671088640 123 << 27 is 11011000000000000000000000000000-1342177280 123 << 28 is 10110000000000000000000000000000 1610612736 123 << 29 is 01100000000000000000000000000000-1073741824 123 << 30 is 11000000000000000000000000000000-2147483648 123 << 31 is 10000000000000000000000000000000 05-21 数 30000 を 0~31 回右シフト (test14_4.c) 05-22 test14_4.c 1 main() /* test14_4.c (p.374) */ 2 { 3 int i; 4 5 printf("decimal 30000 is binary "); 6 printbits(30000); 7 for (i = 0; i < 32; i++) { 8 printf(" %6d 30000 >> %2d is ", 30000 >> i, i); 9 printbits(30000 >> i); 10 } 11 } % cc test14_4.c printbits.c 11

% a.out Decimal 30000 is binary 00000000000000000111010100110000 30000 30000 >> 0 is 00000000000000000111010100110000 15000 30000 >> 1 is 00000000000000000011101010011000 7500 30000 >> 2 is 00000000000000000001110101001100 3750 30000 >> 3 is 00000000000000000000111010100110 1875 30000 >> 4 is 00000000000000000000011101010011 937 30000 >> 5 is 00000000000000000000001110101001 468 30000 >> 6 is 00000000000000000000000111010100 234 30000 >> 7 is 00000000000000000000000011101010 117 30000 >> 8 is 00000000000000000000000001110101 58 30000 >> 9 is 00000000000000000000000000111010 29 30000 >> 10 is 00000000000000000000000000011101 14 30000 >> 11 is 00000000000000000000000000001110 7 30000 >> 12 is 00000000000000000000000000000111 3 30000 >> 13 is 00000000000000000000000000000011 1 30000 >> 14 is 00000000000000000000000000000001 0 30000 >> 15 is 00000000000000000000000000000000 0 30000 >> 16 is 00000000000000000000000000000000 0 30000 >> 17 is 00000000000000000000000000000000 0 30000 >> 18 is 00000000000000000000000000000000 0 30000 >> 19 is 00000000000000000000000000000000 05-23 % 0 30000 >> 20 is 00000000000000000000000000000000 0 30000 >> 21 is 00000000000000000000000000000000 0 30000 >> 22 is 00000000000000000000000000000000 0 30000 >> 23 is 00000000000000000000000000000000 0 30000 >> 24 is 00000000000000000000000000000000 0 30000 >> 25 is 00000000000000000000000000000000 0 30000 >> 26 is 00000000000000000000000000000000 0 30000 >> 27 is 00000000000000000000000000000000 0 30000 >> 28 is 00000000000000000000000000000000 0 30000 >> 29 is 00000000000000000000000000000000 0 30000 >> 30 is 00000000000000000000000000000000 0 30000 >> 31 is 00000000000000000000000000000000 05-24 12

CPro:05-25 数ー 30000 を 0~31 回右シフト (test14_4a.c) test14_4a.c 1 main() /* test14_4a.c */ 2 { 3 int i; 4 5 printf("decimal -30000 is binary "); 6 printbits(-30000); 7 for (i = 0; i < 32; i++) { 8 printf(" %6d -30000 >> %2d is ", -30000 >> i, i); 9 printbits(-30000 >> i); 10 } 11 } % cc test14_4a.c printbits.c % a.out Decimal -30000 is binary 11111111111111111000101011010000-30000 -30000 >> 0 is 11111111111111111000101011010000-15000 -30000 >> 1 is 11111111111111111100010101101000-7500 -30000 >> 2 is 11111111111111111110001010110100-3750 -30000 >> 3 is 11111111111111111111000101011010-1875 -30000 >> 4 is 11111111111111111111100010101101-938 -30000 >> 5 is 11111111111111111111110001010110-469 -30000 >> 6 is 11111111111111111111111000101011-235 -30000 >> 7 is 11111111111111111111111100010101-118 -30000 >> 8 is 11111111111111111111111110001010-59 -30000 >> 9 is 11111111111111111111111111000101-30 -30000 >> 10 is 11111111111111111111111111100010-15 -30000 >> 11 is 11111111111111111111111111110001-8 -30000 >> 12 is 11111111111111111111111111111000-4 -30000 >> 13 is 11111111111111111111111111111100-2 -30000 >> 14 is 11111111111111111111111111111110-1 -30000 >> 15 is 11111111111111111111111111111111-1 -30000 >> 16 is 11111111111111111111111111111111-1 -30000 >> 17 is 11111111111111111111111111111111-1 -30000 >> 18 is 11111111111111111111111111111111-1 -30000 >> 19 is 11111111111111111111111111111111 05-26 13

% -1-30000 >> 20 is 11111111111111111111111111111111-1 -30000 >> 21 is 11111111111111111111111111111111-1 -30000 >> 22 is 11111111111111111111111111111111-1 -30000 >> 23 is 11111111111111111111111111111111-1 -30000 >> 24 is 11111111111111111111111111111111-1 -30000 >> 25 is 11111111111111111111111111111111-1 -30000 >> 26 is 11111111111111111111111111111111-1 -30000 >> 27 is 11111111111111111111111111111111-1 -30000 >> 28 is 11111111111111111111111111111111-1 -30000 >> 29 is 11111111111111111111111111111111-1 -30000 >> 30 is 11111111111111111111111111111111-1 -30000 >> 31 is 11111111111111111111111111111111 05-27 ビットごとの AND 演算子 演算子 : & (&&: 論理積と間違わないように ) int a = 170; /* 0000 000010101010 */ int b = 240; /* 0000 000011110000 */ int z; 05-28 z = a & b; z は 160 となる 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 &) 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 AND 演算の真理値表 A B Z 0 0 0 0 1 0 1 0 0 1 1 1 14

AND 演算を用いれば, マスク が実現できる 05-29 0x01011101 を &) 0x00001111 でマスクすると ---------------------- 0x00001101 すなわち, 下 4ビットのみを取り出せた 2 進化 10 進コード (BCD: Binary Coded Decimal) 1 3 5 8 (10 進数 ) 1 桁ずつ2 進数に 0001 0011 0101 1000 0001001101011000(2 進数 ) = 4952(10 進に変換すると ) ビットごとの OR 演算子 05-30 演算子 : ( : 論理和と間違わないように ) int a = 170; /* 0000 000010101010 */ int b = 240; /* 0000 000011110000 */ int z; z = a b; z は 250 となる 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 ) 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 OR 演算の真理値表 A B Z 0 0 0 0 1 1 1 0 1 1 1 1 15

ビットごとの XOR 演算子 CPro:05-31 演算子 : ^ int a = 170; /* 0000 000010101010 */ int b = 240; /* 0000 000011110000 */ int z; z = a ^ b; z は 90 となる 0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 ^) 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 0 XOR 演算の真理値表 A B Z 0 0 0 0 1 1 1 0 1 1 1 0 XOR(^) を使って,2 つの数を入れ換える (test14_5.c) 05-32 test14_5.c 1 main() /* test14_5.c (p.379) */ 2 { 3 int x = 0x1234; 4 int y = 0x5678; 5 6 printf("x = %x, y = %x n", x, y); 7 x ^= y; 8 y ^= x; 9 x ^= y; 10 printf("x = %x, y = %x n", x, y); 11 } % cc test14_5.c % a.out x = 1234, y = 5678 x = 5678, y = 1234 % 16

14.2 タイプキャスティング 05-33 書式 : ( データ型 ) 式 データ型は,int,short,float,double, および自分で定義した型 (struct) およびそれぞれへのポインタ等 式は, 定数, 変数, 演算子を含んだ式など (long)2 (double)(x + y) (struct abc *)z test14_6.c 1 main() /* test14_6.c (p.382) */ 2 { 3 int i; 4 char result; 5 6 i = 65; 7 result = (char)i; 8 9 printf("i is %c n", i); 10 printf("result is %c n", result); 11 } % cc test14_6.c % a.out i is A result is A % 05-34 17

14.3 sizeof 演算子 05-35 書式 : sizeof( データ型または式 ) sizeof(int) sizeof(x) test14_7.c 1 main() /* test14_7.c (p.384) */ 2 { 3 printf("%d n%d n%d n%d n%d n%d n%d n%d n", 4 sizeof(char), sizeof(int), sizeof(short), 5 sizeof(long), sizeof(float), sizeof(double), 6 sizeof(char *), sizeof(int *)); 7 } % cc test14_7.c % a.out 1 4 2 4 4 8 4 4 % 05-36 18

test14_8.c CPro:05-37 1 /* test14_8.c (p.384) */ 2 struct pencil { 3 int hardness; 4bytes 4 char maker; 1byte 5 int number; 4bytes 6 }; 7 8 main() 9 { 10 int num_of_bytes; 11 struct pencil p0; 12 13 num_of_bytes = sizeof(p0); 14 printf("structure p0 occupies %d bytes n", num_of_bytes); 15 } % cc test14_8.c % a.out structure p0 occupies 12 bytes % 4+1+4=9にならないのは? 14.4 条件演算子 05-38 書式式 1? 式 2 : 式 3 式 1( 条件式 ) を評価し, 真ならば式 2 を, 偽ならば式 3 を値とする (x >= 0)? x : -x 絶対値を返す 19

C 言語入門問題集ー若林研究室ー 基本かつ重要問題, 無印 ふつうの問題, 難易度高の問題 05-39 5-1 ( 略 ) 5-2 整数 n を入力して,1~n までの整数の総和 (=1+2+3+ +n) を公式を使って計算し, 結果を出力するプログラムを作れ. 5-3 変数 x に値 ( 実数 ) を読み込んで, 式 y = 4 x 2 + 3 x - 1 2 1/2 の y の値を計算するプログラムを作れ. ( ヒント ) べき乗の計算には, 数学関数ライブラリ中に pow という関数が用意されている. 使い方はオンラインマニュアル (3M 章 ) で調べること. 5-4 つぎの各式を (1) から (8) までプログラム中で順番に評価した値 ( 演算結果 ) を予測せよ. さらに, 実際に計算するプログラムを作って, 予測した結果と合っていたか確認せよ. すなわち, 各式の演算結果 ( 式を評価した値 ) を別の変数に代入し, その変数の値を出力するプログラムを作成すること. ただし, 変数 a, b, c はいずれも整数型とし, 最初は a = 1, b = 5, c = 12 の値が, それぞれ代入されているものとする. (1) a += b == c (2) (a += b) == c (3) a << b (4) c b (5) a > b (6)!b (7) a < b && b < c (8) a & b c 05-40 ( ヒント ) 算術演算と論理演算が混在していることに注意せよ. C 言語では, 論理値の 真 は 0 以外, 偽 は 0 と決められている, 算術演算と混在して評価した場合, 真 は "1" を返すのが一般的である. 20

14-1 つぎのプログラムを実行したときの結果を予想し, 実際に試してみよ. 1 main() 2 { 3 char a; 4 unsigned char b; 5 6 a = b = -2; 7 8 printf("%d n", a >> 1); 9 printf("%d n", b >> 1); 10 } 05-41 結果を考察するために, 変数 a および b, またシフトした結果の値のビット列をながめて見られるように, プログラムを修正せよ. 14-2 整数系の変数 x,y に 16 進定数 x = 0x57db,y = 0xb0f3 をそれぞれ代入し, つぎの各式の演算結果を 16 進で出力するプログラムを作り実行結果を説明せよ. ただし, 変数 x および y を,short 型で宣言した場合と unsigned short 型で宣言した場合, および long 型で宣言した場合とで結果を比較し考察すること. x & y x ^ y x y x << 1 y >> 2 ~x -x ( 単項演算子のマイナス ) 14-3 テキストのプログラム bcd_to_bin 関数 (p.376) の,for ループを j についてのみのループに書き換えて, この関数の動作を説明せよ. 試す値として,4660 と 4654( いずれも10 進 ) を用いて関数を実行させ, 結果を考察せよ. bcd_to_bin(bcd) unsigned int bcd; { } int i, j, k; for (i = j = 0, k = 1; j < 16; j += 4, k *= 10) { i += k * (bcd >> j & 0xf); } return i; 05-42 21

14-4 Pro:05-43 テキスト p.380 あたり ( スライド 03-15) で議論されている上位, 下位バイトの問題について,4 バイト整数の場合にどうなるかを,SPARC および Pentium で比較してみよ. 試す数として 305419896(10 進 ) を使い, メモリ上の 1 バイトずつの内容を 16 進で順に表示してみること. 結果から, 自分のコンピュータが Little Endian か Big Endian かを考えよ. ( ヒント ) unsigned char 型 (1 バイト ) のポインタが, その整数の変数を指すようにして,1 バイトづつインクリメントして, 中身を 16 進数で表示してみればよい. 14-5 前問をふまえて,4 バイト整数の上位 下位を入れ換える関数を作れ. 14-6 浮動小数点型の変数に適当な値 (0.1,0.01,0.001など) を代入し, そのビット列をながめて, 使用しているコンピュータがどのような符号化を用いているかを推測せよ. ( ヒント ) 浮動小数点型の変数の中身のビット列を見るには, その浮動小数点型の変数のアドレスを,unsigned char 型 (1 バイト ) のポインタ変数に 1 バイトずつ代入し, その中身を見てみればよい. 22