6

いくつかのソースで遊んで、次のようなコードが見つかりました:

void foo(unsigned int i)
{
 if(i<0)
     printf("Less then zero\n");
 else
     printf("greater or equ\n");
}

int main()
{
    int bar = -2;
    foo(bar);
    return 0;
}

意味がないと思いますが、このチェックが理にかなっている場合(セキュリティ?)があるのではないでしょうか?

4

2 に答える 2

12

unsigned int は、定義により 0 未満にすることはできません。したがって、あなたの質問にもっと直接的に答えるために、これは意味がないと考えるのは正しいです. 誤って signed int を 0 を超えてデクリメントし、それを unsigned int としてキャストして配列のインデックスとして使用し、配列外のメモリにインデックスを付けるループのようなものに遭遇しない限り、これも意味のあるセキュリティ項目ではありません。

于 2012-06-21T15:00:10.870 に答える
2

i>=0として宣言さunsignedれ、符号なし整数として解釈されるため、常にそうなります。したがって、最初のテストは常に false になります。

あなたの呼び出しfoo(bar)は実際に を に変換intunsigned intます。これはあなたを混乱させるものかもしれません。また、「変換」は実際には整数のバイト/ビット値を変更しません。形式的な入力と解釈の問題です。

署名付き/署名なしの変換の例については、この回答を参照してください。

簡単な例を次に示します (正確な出力はunsigned int、システム上の のバイト数によって異なります。私にとっては 4 バイトです)。

コード:

printf("%u\n", (unsigned int) -2);

出力:

4294967294
于 2012-06-21T15:03:38.870 に答える