【问题标题】:Why do my .net Int64's behaves as if they were Int32's?为什么我的 .net Int64 的行为就像 Int32 一样?
【发布时间】:2009-05-06 13:28:38
【问题描述】:

我在 .net 程序中目睹了一个奇怪的行为:

Console.WriteLine(Int64.MaxValue.ToString());
// displays 9223372036854775807, which is 2^63-1, as expected

Int64 a = 256*256*256*127; // ok

Int64 a = 256*256*256*128; // compile time error : 
//"The operation overflows at compile time in checked mode"
// If i do this at runtime, I get some negative values, so the overflow indeed happens.

为什么我的 Int64 的行为就好像它们是 Int32 一样,尽管 Int64.MaxValue 似乎确认它们使用的是 64 位?

如果相关,我使用的是 32 位操作系统,并且目标平台设置为“任何 CPU”

【问题讨论】:

    标签: .net 64-bit math integer-overflow int64


    【解决方案1】:

    您的 RHS 仅使用 Int32 值,因此整个操作使用 Int32 算术执行,然后将 Int32 结果提升为 long。

    改成这样:

    Int64 a = 256*256*256*128L;
    

    一切都会好起来的。

    【讨论】:

    • 当你的 Jon Skeet!你比我快10秒! :)
    • 你并不傻,只是一开始有点不直观。当我期望“double res = someInt / otherInt”进行浮点除法(它没有)并得知左侧无关紧要时,我被咬了。
    • @Michael :不,我觉得自己很愚蠢,因为我知道这一点。我很确定我会立即发现问题,如果它发生在其他人身上!奇怪的是,新鲜的外观如何改变一切!事实上,我发布的代码是对我遇到的真实情况的简化,在这种情况下问题更难被发现。正如我所做的那样简化它让除了我之外的每一个人都明白,因为我的头脑对我所面临的“真正”问题有偏见。
    【解决方案2】:

    用途:

    Int64 a = 256L*256L*256L*128L;
    

    L 后缀表示 Int64 字面量,无后缀表示 Int32。

    你写的:

    Int64 a = 256*256*256*128
    

    意思是:

    Int64 a = (Int32)256*(Int32)256*(Int32)256*(Int32)128;
    

    【讨论】:

    • 推荐大写后缀L,因为它更容易识别,而且在某些字体中你甚至无法区分1l
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-05
    • 2022-11-17
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-06-03
    相关资源
    最近更新 更多