strchr(const char *str, int c)の実装について
c=(char)c;が何故必要?->c&=0xffではダメ?->ビット切り取りだと問題が出る事がある。
(char = signed char,int = signed intな環境と仮定)
int c = 0xFFFFFFB1を渡す時
cの上位ビットを切り取ると0x000000B1---------------------[A]
文字列中の文字*strのint昇格後取りうる値0xFFFFFF80-0x0000007F
(charはint型に昇格されて比較される,その際「符号は保持」する。)
マッチする筈の元のiの値0xFFFFFFB1がstrに入っていても[A]の為にはじかれる。
以上の理由でビット切り取りではダメ。
->しかし上記の論は「c=(char)cが必要である事の理由」では無い。
->ではchar,intをsigned,unsignedの各場合について分けて考えてみる。

変換前のint cと変換後(c=(char)c;を行った後)のc(混同を防ぐためc'とする) 比較
signed char,signed intな環境:∀c,-127<c<128でc'=cとなる
unsigned char, unsigned intな環境:∀c,0=<c<256でc'=cとなる
signed char,unsigned intな環境:0=<c<128はc'=c,128=<c<256ではc'が大きな値になる。
unsigned char, signed intな環境:∀c,0=<c<256でc'=cとなる

signed char,unsigned intな環境でかつ、128=<c<256な場合,cとc'に違いがある訳だが
この時c=(char)cがある場合と無い場合ではどのようになるか考えてみる。
無い場合: cは128=<c<256の値をとる。比較時でも当然128=<c<256の値,
    一方*strはchar(signed char)であり整数への拡大が適用される。
    この時-127=<*str<0なる*strは非常に大きな正の値に変換される為
    c=*strであった筈の値でも合致しない事となる。
有る場合: 128=<c<256なるcはc=(char)cで非常に大きな正の値に変換される。
    比較において意図した結果が得られる.
    (変換前のint c(128=<c<256)に対応する*str(-127<=*str<0)中の値)
よってc=(char)c;はchar=signed char,int=unsigned intな環境で128=<c<256 なcの値の時必要。