boolの摩訶不思議

UN
記事: 18
登録日時: 14年前
住所: 神奈川県

boolの摩訶不思議

投稿記事 by UN » 14年前

windowsformsでプログラムを作って、ファイルを書き出し!
そんで読み込み部分作ったらなぜかバグった・・
見てみたら、sizeofでbool型で定義した変数が1で返ってきて
オフセットがずれていた。
書き込み時は4で返るのに、読み込みだけ1で返ってくる。
なんじゃこりゃーー、調べたがよくわからない。
しかし小文字boolに関してはあまり信用されていないことだけはわかった。
大文字BOOLはIPhoneとか色んなとこでバッティングするから好きじゃないんだけどなぁ・・

アバター
御津凪
管理人
記事: 200
登録日時: 15年前

Re: boolの摩訶不思議

投稿記事 by 御津凪 » 14年前

処理系によってはbool型は1になったり4になったり、マクロで別の型の名前に置き換えられたりとデータサイズが一定になりにくい基本型の一つです。
データを書きだす時など、データサイズが重要な処理ではBYTE(unsigned char)型等のデータサイズが確定している(もしくは固定だと確認した)型の変数に代入したうえで使用することを推奨します。

bool 型によらず、32bit/64bit 間でもデータサイズが変化する型が存在するので、typedef 等で定義済みの型のデータサイズを余り鵜呑みにしてはいけません。

UN
記事: 18
登録日時: 14年前
住所: 神奈川県

Re: boolの摩訶不思議

投稿記事 by UN » 14年前

ほほー、処理系で型が変わるものがあるなんて初耳ですね・・勉強になります。
詳しいご説明ありがとうございます。

ISLe
記事: 2650
登録日時: 15年前

Re: boolの摩訶不思議

投稿記事 by ISLe » 14年前

規格上はchar以外すべてデータサイズが決まってないです。
sizeof(char)が1だというだけでビット数が決まってないですし。

ビット幅が重要なデータの場合は、stdint.hで定義されるint8_tとかの型を使うのが良いと思います。

UN
記事: 18
登録日時: 14年前
住所: 神奈川県

Re: boolの摩訶不思議

投稿記事 by UN » 14年前

ありがとうございます、色々調べてint8_tやらint64_やらの重要性がわかったきがしました。
個人的にはIPhoneとかにうつすとコンパイル通らないので嫌っていたふしがあるのですが見直そうと思います。

しかし驚愕の事実すぎて、今まで作ってきたやつが、同じようにオフセット管理してただけにバグらないかどうか不安だ・・