本気でやってるから面白い
昨日は休日出勤でした。。。
最近は社内雑務が多くてプロジェクトの作業が全然できていません。。
早く雑務に慣れてルーティーンワークレベルまで落とし込まないとですね!
今日は録りためていた『水曜日のダウンタウン』を観ていました!!
とても面白いですね!
番組中にサンドウィッチマンの伊達さんが言ってましたが、「本気でやってるから面白い」という言葉はいい言葉ですね!!
伊達さんは真剣にやっている最中に起こった失敗は面白いという意味で使っていました!
私は別の意味で使おうと思います!
私は本気で取り組んでいると、その取り組んでいることが面白くなってくると思います。
使い古された言葉かもしれませんが、私はC言語を勉強していてそう感じてます。
私はまだ本気でやれていないかもしれませんが、面白くなっています。
すごく難しいんですけどコンピュータをコントロールできるというメリットが大きいです。昨今の複雑で大規模なシステムではシステムをブラックボックスにしてしまうのは大きなリスクです。不具合が見つかった場合に原因を見つけることも直すことも難しくなります。
そもそも中身が分からないですから調べられないことも多そうです。
システムが重要になっている昨今では万が一何か起きたときに調べられないということは恐ろしいことです。
だからこそOSを作ることができるC言語をマスターしてシステム自体をホワイトボックス化してコントロールできるようになることは大事なことだと思います。
皆さんC言語をマスターしましょう!!!
システム開発の世界では、真剣にやっている最中に起こった失敗は笑えないですからね。
最近やってしまったコーディングミス オーバーフロー
私が最近やってしまったコーディングミスを書きます。
何かと言うと、int型✖️int型の計算結果をlong型変数に代入させるときに、少なくとも一つの変数をlong型にキャストするのを忘れてました!
何が悪いのかというと、int型✖️int型の結果はint型になるので計算結果がINT_MAXを超えるとオーバーフローし意図した計算結果にならないです。
四則演算の演算子を使用するときは計算結果の型は意識しないといけないですね!
後、よくあるのはint型➗int型をfloat型変数に代入するときも意図した計算結果にならない可能性があります。
int型➗int型の計算結果はint型なので小数点部分は切り捨てられて、整数の状態でfloat型変数に代入されます!
対策は少なくとも一つの変数をfloat型にキャストする!ですね。
こんなミスをゼロにするにはどうしたらいいのか。。
この問題に対してはここでミスをしやすいということを認識した上でプログラム試験時にこの誤りをあぶり出す試験ケースを作ることだと思います!
お金と時間はかかりますけどね💦
試験をしっかりしてミスをあぶり出すことが大事ですね!
皆さんも気をつけてください!!!
雑談 C言語の面白さ
C言語 | キャストするとどうなるの? (long型→int型、int型→long型の変換)
予告していたとおり、「キャストするとどうなるの?」という疑問を解消するためにテストプログラムを作って動かしていこうと思います。
先ず、キャストとは何かというと、
プログラムにおいて、あるデータ型を他のデータ型に変換することです。
では、キャストすると何が起きるの?
値をそのままでデータ型のみが変更されます。
小数を扱うシステムはそこまで多くないと思っていますので、
今回は整数を格納するデータ型int型、long型を使用して
実際に変換するプログラムを2つ作成しました。
実行環境は以下に記載しているので参考にしてください。
https://programing-experiment.hatenablog.jp/entry/2019/02/16/010421
例1:int型(32bit) → long型(64bit)
#include <stdio.h> int main (void) { long value_long; int value_int; /* int型(32bit) → long型(64bit) */ value_int = -1; value_long = (long)value_int; printf("int: %d(0x%08x), long: %ld(0x%016lx)\n", value_int, value_int, value_long, value_long); value_int = 1; value_long = (long)value_int; printf("int: %d(0x%08x), long: %ld(0x%016lx)\n", value_int, value_int, value_long, value_long); return (0); }
実行結果(括弧の中は16進数表記)
int: -1(0xffffffff), long: -1(0xffffffffffffffff)
int: 1(0x00000001), long: 1(0x0000000000000001)
例2:long型(64bit) → int型(32bit)
#include <stdio.h> #include <limits.h> int main (void) { long value_long; int value_int; /* long型(64bit) → int型(32bit) */ value_long = LONG_MAX; value_int = (int)value_long; printf("long: %ld(0x%016lx), int: %d(0x%08x)\n", value_long, value_long, value_int, value_int); value_long = 0x123456789abcde56; value_int = (int)value_long; printf("long: %ld(0x%016lx), int: %d(0x%08x)\n", value_long, value_long, value_int, value_int); return (0); }
実行結果(括弧の中は16進数表記)
long: 9223372036854775807(0x7fffffffffffffff), int: -1(0xffffffff)
long: 1311768467463790166(0x123456789abcde56), int: -1698898346(0x9abcde56)
例2の実行結果の2行目を見るとlong型→int型の変換を行った際に符号も含めて値がごろっと変わってしまいました!!
キャスト後のデータサイズがキャスト前のデータサイズより小さい場合はキャストにより意図しない値に変わる場合があります。
私の環境ではlong型の値16進数表記での後半半分が表示されました。
(詳しい人は下位4バイトと言うかもしれません。)
int型で表現できない値を格納している時にint型にキャストすると意図しない値となりますのでint型の変数にlong型の値を代入する場合はご注意下さい。
今回はint型→long型、long型→int型の変換をするプログラムを作成し、変換結果を観察しました。
次回はポインタ変数のキャストについて書こうと思っています。
プログラムの開発環境、実行環境について
今回はプログラムの開発環境、実行環境を紹介します。
今回は開発環境と実行環境は同じです。
私の環境と異なる環境で動かした場合、うまく動かないことがあると思いますのでご注意下さい!!
開発環境、実行環境
CPU:Intel(R) Core(TM) i3-2350M(2.30GHz)
2コア
メモリ:4GB(DDR3)1枚
ディスク:750GB
OS:CentOS Linux release 7.3.1611
コンパイラ:gcc バージョン 4.8.5 20150623 (Red Hat 4.8.5-11) (GCC)
補足:64bitの環境ですので、32bitの環境の方は参考にできないのでご注意ください
OSに関してはCentOS7をインストールしてからカスタマイズしていませんので、このくらいの情報があれば問題ないかと思います。
もし足りない場合はコメントを頂けたら幸いです。
次回はいよいよプログラムを作っていきます。
『キャストしたら値はどうなるの?』について調べようと思います!!
参考)
実行環境の情報を調べたコマンドは以下の通りです。
CPU:cat /proc/cpuinfo
メモリ:dmidecode --type memory ←スーパーユーザで実行
ディスク:fdisk -l
OS:cat /etc/redhat-release
このブログでやりたいこと
はじめまして。
ペンネームは決めておりませんので、決まれば名乗ります。
私の職業はSEです!
ですから少しはプログラミングができます!
メインはC言語です( ˙-˙ )
そうです、今時ではありませんwww
そして、仕事でも使用しているのですが、C言語が出来る人が少なすぎて困っています!!!
そこで私は立ち上がります!
C言語に関する疑問についてテストプログラムを作って回答を出していこうと思っています!!
そうすることで、一人でもC言語が出来るようになればと考えています!!
布教ですね!
今後記述する記事で登場させるソースコードは極力どんなOSでも動くようにしたいと思っていますが、基本的にはLinuxだと考えておいてください!
詳細は後日追加します!
もし知りたいことがあるのであれば、コメントを頂けたら記事にしようと思いますのでよろしくお願いします!