1

私のプログラムでは、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;
}
4

2 に答える 2

5

おそらく、実際の文字定数と比較する方が賢明です。整数拡張は、の両方のオペランドで引き続き発生しますが==、少なくとも同じ方法で発生し、またはcharのサイズのの符号に依存することはありません。intunsigned int

例えば

if (*argv[1] == '\xcc')

charARMコンパイラでは符号なしを作成するのが一般的であると思います。つまり'\xcc'、整数に昇格すると、0xccではなく値を取得します0xffffffcc

于 2012-06-24T10:35:45.743 に答える
5

ARM システムでは、char型は通常デフォルトで符号なしですが、x86 では通常符号付きです。等価演算子==は両方のオペランドの整数昇格を実行するため、*argv[1]符号付き (符号拡張が実行される) または符号なし (符号拡張が実行されない) と見なされる場合の動作の違い。

オプションとを使用してgccタイプのデフォルトを変更できることに注意してください。char-fsigned-char-funsigned-char

于 2012-06-24T10:42:59.910 に答える