0

たとえば、このコードをいつ使用するのか疑問に思いました。

#include <stdio.h>
int main(){
    int b;
    scanf("%d",&b);
    if (b)
        printf("right\n");
    else
        printf("zero entered\n");
    return 0;
}

コンパイラは、実行する必要があるかどうか、実行する必要があるかどうかをどのように知ることができb!= 0ますかprintf("right\n");b == 0printf("zero entered\n");

そして、私が別の変数を持っていて、論理演算からの戻り値が orかaどうかを確認した場合。この値はどのように取得されますか? 関数ですか?a > b10

4

3 に答える 3

2

コンパイラがこれを処理する方法は、それを適切なマシン命令に変換することです。

この場合:

if (b)

これは通常、x86 マシンでは次のように変換されます。

cmp eax, eax ; compare register eax with itself
jz  target   ; jump to target if zero

上記のコードは、ゼロが CPU の特殊なケースであることを示しています。ほとんどではないにしても多くの命令が、値を操作するときにいくつかの内部フラグを設定するため、後でjzand jnz(ゼロでない場合はジャンプ) を実行できます。 .

他にも、オーバーフロー、キャリー、サイン、パリティなどのフラグがあります。

比較として、CPU でネイティブに処理できる型については、組み込みの命令があります。

mov eax, a  ; eax = a
cmp eax, b  ; compare eax to b
jl  target  ; jump to target if less (eax < b --> a < b)

ジャンプ手順の詳細については、インテル x86 JUMP クイック リファレンス を参照してください

型をネイティブに処理できない場合は、通常、0/1 (または 0/N、N は負の可能性があることに注意してください) の値を返す関数呼び出しを伴います。この場合、if (b)処理する命令の型にフォールバックします。その関数の結果。

このようなもの:

mov  eax, a    ; eax = a
mov  ebx, b    ; ebx = b
call function  ; call comparison function, result returned in eax
cmp  eax, eax
jz   notequal
于 2013-08-19T06:56:17.120 に答える
0

値が真か偽かを確認する場合は、ゼロ以外のすべての整数が真であるため、常にゼロと比較する必要があります。

于 2013-08-19T06:48:59.080 に答える