3

次のコードのlongデータ型の何が問題になっていますか?time = 42およびTimeStyle.Daysで-666167296を返しますか?

    private long ConvertToMilliSeconds(int time, TimeStyle style)
    {
        long t = 0;
        switch (style)
        {
            case TimeStyle.Millisecons:
                t = time;
                break;
            case TimeStyle.Seconds:
                t = time * 1000;
                break;
            case TimeStyle.Minutes:
                t = time * 1000 * 60;
                break;
            case TimeStyle.Hours:
                t = time * 1000 * 60 * 60;
                break;
            case TimeStyle.Days:
                t = time * 86400000;
                break;
            default:
                break;
        }

        return t;
    }
4

3 に答える 3

7

timeであるint、それを作るか、またはlongにキャストするlong* 86400000L

于 2012-08-03T07:57:13.183 に答える
3

このような計算を行う場合:

t = time * 86400000

taであるという事実は関係ありません。とは両方の値longであるため、代入演算子の右側の算術演算は32ビットで実行されます。オーバーフローを回避するには、演算を算術演算で実行する必要があります。time86400000intlong

longミリ秒数を設定するのが妥当な場合は、に変更tlongます。列挙値が認識されない場合も、0を返すだけでなく、例外をスローします。

private static long ConvertToMilliSeconds(long time, TimeStyle style)
{
    switch (style)
    {
        // Note: fixed typo in enum name
        case TimeStyle.Milliseconds: return time;
        case TimeStyle.Seconds:      return time * 1000;
        case TimeStyle.Minutes:      return time * 1000 * 60;
        case TimeStyle.Hours:        return time * 1000 * 60 * 60;
        case TimeStyle.Days:         return time * 86400000;
        default:
            throw new ArgumentOutOfRangeException("style");
    }
}

これらの値を定数に変更することもできます。

private const long MillisecondsPerSecond = 1000;
private const long MillisecondsPerMinute = MillisecondsPerSecond * 60;
private const long MillisecondsPerHour = MillisecondsPerMinute * 60;
private const long MillisecondsPerDay = MillisecondsPerHour * 24;

...そしてメソッドでそれらを使用します。

最後に、間違った単位で値を取得する可能性のある混乱を避けるために、最初から使用TimeSpanすることをお勧めします...それでも日付/時刻APIが苦痛であることがわかっている場合は、調べてみてください。私の野田タイムライブラリで:)

于 2012-08-03T07:59:47.493 に答える
0

42*86400000は長い間大きすぎます。Visual-Studioで入力すると、コンパイラエラーが発生します。

チェックモードでは、コンパイル時に操作がオーバーフローします

于 2012-08-03T08:00:18.203 に答える