C言語のサイトの間違い報告

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Justy

C言語のサイトの間違い報告

#1

投稿記事 by Justy » 17年前

 こんばんわ。

> C言語のサイト、おかしいとこ修正や、補足説明などつけたしなどしておきました。
> 3章までは大丈夫(ヲイ)

 見てきました。
 すごく丁寧に説明してあって判りやすかったです。
 より良くする為にも折角なんで3章までの見逃せないところだけ突っ込んでみます♪


□ 1-4 変数の宣言

> これだけ種類があります
 (C99で追加されたものを除いても)重要なものが抜けてます。signed charがありません。
 char系は signed char / unsigned char / charの3種あり、charはその環境にとって文字列を格納するのに都合がいい型になるので符号が付くか付かないかは環境依存となります。

 だから、limits.hの char型系の MIN/MAX定義が3つあるわけですね。


> float 仮数部2^32、指数部2^8
 仮数部は 23では?
 どうでもいいですが昔 sizeof(float)=sizeof(double)=4なコンパイラを見たことがあります。
 きっと floatが2バイトな環境も世の中にはあるんでしょうね。


□ 2-5 条件式
> x !== y
 先生、JavaScriptが混ざってます!(w


 と、こんなところでしょうか。

P.S. 15日のリニューアル楽しみにしています。

管理人

Re:C言語のサイト

#2

投稿記事 by 管理人 » 17年前

ぐは!
やはり見ていない部分には間違いのある可能性大!!
Justy様ご指摘アリガトウゴザイマスm(_ _)m

> signed char...

char は (singed)char という意味で書いたのですが
char と signed charって違うんですか?

intもsigned intと同じ意味だと思っていましたが・・・。

signed = 符号付
unsigned = 符号無し(正の値だけ)

何もかかなければ符号付という解釈は間違ってるんでしょうか?


> 仮数部は 23では?

floatは4バイトだから32bitで、、って仮数部32やったら仮数部だけで埋まるやん!!
おっしゃるとおりです。

> sizeof(float)=sizeof(double)=4...

普通はfloat=32bit double=64bitと解釈していいんですよね?


> 先生、JavaScriptが混ざってます!(w

うは!当時はJavaScript知らんかったんで単なる記述ミスですw

ありがとうございました!
直しておきます。


> P.S. 15日のリニューアル楽しみにしています。

土曜日の夜から作り始めるんでちゃんと形になるものやら^^;

管理人

Re:C言語のサイト

#3

投稿記事 by 管理人 » 17年前

直してアップロードしたんですけど、
よく考えたらあの時点で説明も無しに仮数部とか言ってもよくわからないし、
仮数部なんて知らなくてもプログラム書けるから
仮数部の記述は消しました^^;

バイトだけ知ってたら大ジョブですもんね。
仮数部の知識が必要な頃には自分でどっかで勉強するでしょう(無責任)

管理人

Re:C言語のサイト

#4

投稿記事 by 管理人 » 17年前

あ!
今見たら「ハローワード」って書いてある・・しかも全部。。
まぁ「こんにちはC言語」の言語はwordって感じでとらえてもおかしくないから「こんにちはC言語」って感じで解釈よろしく!!

ちなみにC言語は「C Programming Language」ですからwordではありませんm(_ _)m

Justy

Re:C言語のサイト

#5

投稿記事 by Justy » 17年前

>char は (singed)char という意味で書いたのですが
>char と signed charって違うんですか?
>intもsigned intと同じ意味だと思っていましたが・・・。

 intは同じ意味なのですが、charだけ特殊です。
 
ttp://www.kab-studio.biz/Programing/PragmaTwice/Main/205.html
ttp://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200205/02050091.txt

 VCだとコンパイラオプションで charを signedにするか unsignedにするかを自分で決められます。
 この段階でもうどっちなのかは、その環境次第というかその人の気分次第になります。
(あくまで扱い的にどっちかということで、型としては別物となります。だから std::numeric_limits<>もchar系は3つ特殊かされています)


>何もかかなければ符号付という解釈は間違ってるんでしょうか?
 char以外はそう捉えていいはずです。


>普通はfloat=32bit double=64bitと解釈していいんですよね?
 メジャーな環境では、そうですね。
 ただこないだ遭遇した現象で、型としては 32bitだけど必ずしも・・・ってことがありました。

・ 与えられた float値をエンディアン変換して、そのまま強引に float値として戻値としていた。
・ 最適化の関係で戻値が FPUレジスタ(80bit)に乗ってしまい、その課程で関数の戻り先で値が変化してしまった。

 何が起こったかというと。
 エンディアンが逆になれば正しい float値を構成できず Nan扱いになって、80bit-32bitの相互変換時にビット列が微妙に変化してしまった、というのが真相です。

 非最適化だと、戻り値はスタック(メモリ)に入り 32bitの元のビット列を維持できていたので、気付きにくかったというのと、その変化の具合が実に微妙で、数値としては最後の桁のあたりが微妙に変わってしまう、くらいだったのでやっぱり気付きにくかったってところが大きな罠でした。

 書いた時点では常に 32bitのつもりだったので、ビット列が変化するとは思ってもいなくてこんな罠もあるんだなぁ、としみじみ。


>ハローワード
 ハローワールドに真っ向から対抗して面白いなぁ、と思ってました(w

管理人

Re:C言語のサイト

#6

投稿記事 by 管理人 » 17年前

なるほど、比較する時にunsingedの役目がでてくる訳ですね。
勉強になりました!

色んな環境でプログラムに携わる時は色んな可能性を考えないといけないんですね・・。
いままで常識だった事も忘れてチェックしないといけないと・・。

閉鎖

“C言語何でも質問掲示板” へ戻る