以下代码中的long数据类型有什么问题,它返回-666167296,时间= 42,TimeStyle.Days?
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;
}
答案 0 :(得分:7)
time
是int
,将其设为long
或投放到long
或* 86400000L
答案 1 :(得分:3)
当你进行这样的计算时:
t = time * 86400000
t
是long
这一事实无关紧要:赋值运算符右侧的算法以32位执行,因为time
和86400000
都是int
值。您需要在long
算术中执行操作以避免溢出。
考虑到long
毫秒数是合理的,我只需将t
更改为long
。如果无法识别枚举值,我也会抛出异常,而不是只返回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很痛苦,你可能想查看我的Noda Time库:)
答案 2 :(得分:0)
操作在编译时以检查模式溢出