Re: Android版:char型のバグ ( No.1 ) |
- 名前:サファリ 日時:2017/03/11 20:33
まず、バグでは無いと思います。
(プログラミング経験のある人なら、処理系による"暗黙の了解"です。)
普段は、charと書くと signed char(-128〜+127)で処理されると考えがちですが、変数の型の扱いは処理系にって異なります。
AndroidOSは、char型を unsigend char(0〜+255)として処理している関係で、そうした動作に成るのだと思います。
処理系に依存しないコードを書くなら型の unsigend/signed を確かりと記述したほうが良いと思います。
昔の人のプログラムで、
char flg = -1; //=0xFFの意味
と書かれるのは、char型の8bit全てを'1'する為に書かれたコードです。
だからそれを書いた人は、if(flg == -1){ /* 処理 */ }とは、書かないはずです。
もし書くなら、if(flg & -1){ /* 処理 */ }と書いたはずです。
いろんな所で安易に、char型をフラグ変数の様に扱いがちですが、
これからプログラミングを勉強するのなら止めた方が良い書き方だと思います。
|
Re: Android版:char型のバグ ( No.2 ) |
- 名前:ギウ 日時:2017/03/11 21:19
サファリ様
> AndroidOSは、char型を unsigend char(0〜+255)として処理している
おお!? そうだったんですね、勉強になりました。
有難うございます!
Windowsとコンシューマくらいしかやってこなかったので知りませんでした。
|
Re: Android版:char型のバグ ( No.3 ) |
- 名前:ギウ 日時:2017/03/11 22:35
因みに、実際は数値を計算させてました。
chr[n].life -= dmg; // ダメージは1〜3程度、Lifeは20くらい
if( chr[n].life < 0 )
chr[n].life = 0;
という感じで書いてたらバグったと。
|
Re: Android版:char型のバグ ( No.4 ) |
- 名前:サファリ 日時:2017/03/12 02:13
誤記の修正です。
修正前:もし書くなら、if(flg & -1){ /* 処理 */ }と書いたはずです。
修正後:もし書くなら、if((flg ^ 0xff)== 0){ /* 処理 */ }と書いたはず。
ダメージ計算す場合は、元の数値を直接変更せずに一時変数に取って計算するか。
チェックしてから変更する様にした方が、要らないバグを増やさなくて良いですね。
if( chr[n].life <= dmg ) // ライフを0以下の数値にしない為にチェックを先にする。
chr[n].lif = 0;
else
chr[n].life -= dmg;
|
Re: Android版:char型のバグ ( No.5 ) |
- 名前:yumetodo 日時:2017/03/22 16:39
8bitである必要があるのなら、
#include <cstdint>
して、std::int8_t / std::uint8_t 型を利用するべきだと思われます。
|