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
と警告されるけど、符号型かどうか返してくれる。
こんな感じで

int z;
#define issigned(t) ( z = (t += 128, t < 0), z |= (t += 128, t < 0) )
代入するとVC++でも求まるけど、thread safeでなくなってしまう。VC++だとマクロ中で一時変数が作れないし。