2

うわー、私は自分の C++ を知っていると思っていましたが、これは奇妙です

この関数は unsigned int を返すので、負の数が返されることは決してないと思いました。

この関数は、UTC から何時間進んでいるか遅れているかを判断します。私はオーストラリアのシドニーにいるので、+10 GMT です。つまり、UTC = LocalTime + (-10) です。したがって、GetTimeZoneInformation は私が -10 であると正しく判断します。

しかし、私の関数は unsigned int を返すので、-10 ではなく 10 を返すべきではありませんか?

unsigned int getTimeZoneBias()
{
    TIME_ZONE_INFORMATION tzInfo;
    DWORD res  = GetTimeZoneInformation( &tzInfo );

    if ( res == TIME_ZONE_ID_INVALID )
    {
        return (INT_MAX/2); 
    }

    return (unsigned int(tzInfo.Bias / 60));  // convert from minutes to hours         
}

TCHAR ch[200];
_stprintf( ch, _T("A: %d\n"), getTimeZoneBias()); // this prints out A: -10
debugLog += _T("Bias: ") + tstring(ch) + _T("\r\n");
4

4 に答える 4

10

unsigned intをとして印刷しようとしていsigned intます。%dに変更%u

_stprintf( ch, _T("A: %u\n"), getTimeZoneBias());
                       ^

問題は、ほとんどのコンピューターでは、整数自体が正または負ではないことです。それは彼らが解釈される方法にあります。

そのため、大きな整数は小さな (絶対値) 負の整数と見分けがつかない場合があります。

于 2011-10-01T04:11:59.177 に答える
4

これが私が起こっていると思うことです:

の値tzInfo.Biasは実際には -10 です。( 0xFFFFFFF6) ほとんどのシステムでは、符号付き整数を同じサイズの符号なし整数にキャストしても、表現には何の影響もありません。

したがって、関数は引き続き を返します0xFFFFFFF6

しかし、それを印刷すると、符号付き整数として印刷されます。したがって、印刷され-10ます。符号なし整数として出力すると、おそらく4294967286.

おそらくあなたがしようとしているのは、時差の絶対値を取得することです。したがって、この -10 を 10 に変換する必要がありますabs(tzInfo.Bias / 60)

于 2011-10-01T04:13:48.787 に答える
2

通話に 1 つのエラーがあります_T。そのはず:

_T("A: %u\n")

関数負でない整数を返します。ただし、間違った printf 指定子を使用すると、スタックから整数としてポップされます。言い換えれば、ビットは間違って解釈されます。これも未定義の動作だと思います。

于 2011-10-01T04:12:02.137 に答える
1

他の人が指摘しているように、にキャストすると、unsigned int実際にはコンパイラに のビットのパターンを使用し、intそれを として使用するように指示していunsigned intます。お使いのコンピューターが2 の補数を使用している場合は、ほとんどの場合と同様に、数値が期待どおりに解釈されませUINT_MAX-1010。書式指定子を使用すると、コンパイラは . の代わりに.%dと同じビット パターンを使用するように戻ります。これが、あなたがまだ得ている理由です。intunsigned int-10

整数の絶対値が必要な場合は、キャストを使用する代わりに数学的に取得するようにしてください。

于 2011-10-01T04:21:27.577 に答える