私のプログラムでは、charを16進intと比較し、X86 PCとARMハンドヘルドで実行し、n900でarm-gccまたはnative gccでコンパイルすると、異なる結果が得られます。どちらの場合も、条件はPCに当てはまり、モバイルには渡されません。
int main(int argc, char *argv[])
{
if (*argv[1] == 0xffffffcc)
puts("ok");
return 0;
}
おそらく、実際の文字定数と比較する方が賢明です。整数拡張は、の両方のオペランドで引き続き発生しますが==
、少なくとも同じ方法で発生し、またはchar
のサイズのの符号に依存することはありません。int
unsigned int
例えば
if (*argv[1] == '\xcc')
char
ARMコンパイラでは符号なしを作成するのが一般的であると思います。つまり'\xcc'
、整数に昇格すると、0xcc
ではなく値を取得します0xffffffcc
。
ARM システムでは、char
型は通常デフォルトで符号なしですが、x86 では通常符号付きです。等価演算子==
は両方のオペランドの整数昇格を実行するため、*argv[1]
符号付き (符号拡張が実行される) または符号なし (符号拡張が実行されない) と見なされる場合の動作の違い。
オプションとを使用してgcc
タイプのデフォルトを変更できることに注意してください。char
-fsigned-char
-funsigned-char