#signedとunsigned
signed/unsignedとは、変数に修飾子として付けることで符号有り(負数と正数)/符号無し(正数)を決めるもの。
符号有りの場合、先頭1bitを符号として扱うため、表現できる値が少なくなります。
#include <bits/stdc++.h>
using namespace std;
int main()
{
// unsigned char:1バイト(-128~127)
signed char a = 0;
// unsigned char:1バイト(0~255)
unsigned char b = 0;
a = -1;
b = -1;
cout << (int)a << endl;
cout << (int)b << endl;
}
出力結果
-1
255
signed変数に負数を代入した場合、1の2の補数1111 1111で表現できる255となります。
静的解析で引っかかったこと
とあるコードの静的解析で以下の箇所がひっかかりました。
int example( int iAug)
{
uint uiTemp = 0;
uiTemp = iAug;
// 省略
}
#問題点
処理系依存ですが、(signed)intは符号あり整数型4バイト、unsigned intも符号なし整数型4バイト。
同じデータ型、同じ4バイトでも表現できる数値が異なるため、unsignedで修飾した変数に負数を格納できるsigned変数を代入した場合、予期せぬ動作となるため、気を付けないといけません。
変数同士でデータの受け渡しを行う場合、データ型、符号の有無は出来るだけ揃える処理にしましょう。
(型変換もありですが、型変換しないといけない処理を見直したほうがいいかもしれません。)