2016-10-05 4 views
5
unsigned long mynum = 7; 

if(mynum > -1) // false 

どうしてですか?それは-1がintなので、unsigned longに "昇進"すると、unsigned longの最大値を取得するからでしょうか?なぜunsigned longと負の数値を比較するとfalseになるのですか?

+1

この比較では符号付きの符号なしとなりますが、正しいと思います... –

+1

コンパイラの警告レベルが十分ではないことも意味します。 – WhozCraig

+0

@WhozCraig私のコンパイラは、 "if(mynum> = 0)"を実行すると常に真であると警告しますが、そうでなければただ終了します.... Xcode 8、lldb ... –

答えて

2

これは正しいことが、ここで私が何を考えていない可能性があります:符号なしの値が0未満にすることはできませんので
次のコード

unsigned long a = -8; 
std::cout << a; 

を実行すると、それはunsigned long型の最大値を返します。この場合、8または4294967288。
そしてそれはunsigned long型

2

符号なし変数に変換してしまったとき、あなたの操作で-1に何が起こったthatsのは、最後のビットが正であるので、彼らはマイナス記号を持っていない最大値を有します。 -1及び255は、同じビットフィールドが設定されている:対応する符号付き値に値を設定し、符号なしの負の値を割り当てる

#include <iostream> 

int main() 
{ 
    unsigned char uc1 = 255; // 11111111 
    unsigned char uc2 = -1; 

    //signed : -1 : 11111111 : 1 1111111 : -128 + 127 
    //unsigned: 255: 11111111 : 1 1111111 : 128 + 127 

    if(uc1 == uc2) 
     std::cout << "uc1 = uc2" << std::endl; 

    return 0; 
} 
2

これは、コンパイラによって内部的に実行されるimplicit typecastであります。

操作が2つの異なるタイプの変数間で行われるとき、コンパイラ自体は、下位のデータ型を一時的に上位のデータ型に型キャスト(一時的に変換)します。

ここでコード-1は、unsigned longとして一時的に動作します。これは、コンパイラ自体によって暗黙の型キャストが実行されるためです。他の変数はそのタイプのpfなので、unsigned longのように動作します。

ここでは、-1は-1として扱われませんが、unsigned longとして等価として扱われます。

関連する問題