unsigned long mynum = 7;
if(mynum > -1) // false
どうしてですか?それは-1がintなので、unsigned longに "昇進"すると、unsigned longの最大値を取得するからでしょうか?なぜunsigned longと負の数値を比較するとfalseになるのですか?
unsigned long mynum = 7;
if(mynum > -1) // false
どうしてですか?それは-1がintなので、unsigned longに "昇進"すると、unsigned longの最大値を取得するからでしょうか?なぜunsigned longと負の数値を比較するとfalseになるのですか?
これは正しいことが、ここで私が何を考えていない可能性があります:符号なしの値が0未満にすることはできませんので
次のコード
unsigned long a = -8;
std::cout << a;
を実行すると、それはunsigned long型の最大値を返します。この場合、8または4294967288。
そしてそれはunsigned long型
符号なし変数に変換してしまったとき、あなたの操作で-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;
}
これは、コンパイラによって内部的に実行されるimplicit typecast
であります。
操作が2つの異なるタイプの変数間で行われるとき、コンパイラ自体は、下位のデータ型を一時的に上位のデータ型に型キャスト(一時的に変換)します。
ここでコード-1
は、unsigned long
として一時的に動作します。これは、コンパイラ自体によって暗黙の型キャストが実行されるためです。他の変数はそのタイプのpfなので、unsigned long
のように動作します。
ここでは、-1は-1
として扱われませんが、unsigned long
として等価として扱われます。
この比較では符号付きの符号なしとなりますが、正しいと思います... –
コンパイラの警告レベルが十分ではないことも意味します。 – WhozCraig
@WhozCraig私のコンパイラは、 "if(mynum> = 0)"を実行すると常に真であると警告しますが、そうでなければただ終了します.... Xcode 8、lldb ... –