issigned
http://d.hatena.ne.jp/kikx/20061106#1162810655
さっぱりわからない...
VC++で試していたら、char型で
#define issigned(t) ((t += 128) < 0) | ((t += 128) < 0)が常にゼロになっている。
GCC(3.4)だと
warning: comparison is always false due to limited range of data typeと警告されるけど、符号型かどうか返してくれる。
こんな感じで
代入するとVC++でも求まるけど、thread safeでなくなってしまう。VC++だとマクロ中で一時変数が作れないし。
int z;
#define issigned(t) ( z = (t += 128, t < 0), z |= (t += 128, t < 0) )