Max HEX value for long type

前端 未结 4 1885
情书的邮戳
情书的邮戳 2021-01-21 23:38

I have ported Java code to C#. Could you please explain why I have compile-time error in the follow line (I use VS 2008):

    private long l = 0xffffffffffffffff         


        
相关标签:
4条回答
  • 2021-01-21 23:44

    0xffffffffffffffff is larger than a signed long can represent.

    You can insert a cast:

     private long l = unchecked( (long)0xffffffffffffffffL);
    

    Since C# uses two's complement, 0xffffffffffffffff represents -1:

    private long l = -1;
    

    Or declare the variable as unsigned, which is probably the cleanest choice if you want to represent bit patterns:

    private ulong l = 0xffffffffffffffffL;
    private ulong l = ulong.MaxValue;
    

    The maximal value of a singed long is:

    private long l = 0x7fffffffffffffffL;
    

    But that's better written as long.MaxValue.

    0 讨论(0)
  • 2021-01-21 23:48

    You could do this:

    private long l = long.MaxValue;
    

    ... but as mdm pointed out, you probably actually want a ulong.

    private ulong l = ulong.MaxValue;
    
    0 讨论(0)
  • 2021-01-21 23:50

    Assuming you aren't worried about negative values, you could try using an unsigned long:

    private ulong l = 0xffffffffffffffffL;
    

    In Java the actual value of l would be -1, because it would overflow the 2^63 - 1 maximum value, so you could just replace your constant with -1.

    0 讨论(0)
  • 2021-01-22 00:08

    Java doesn't mind if a constant overflows in this particular situation - the value you've given is actually -1.

    The simplest way of achieving the same effect in C# is:

    private long l = -1;
    

    If you want to retain the 16 fs you could use:

    private long l = unchecked((long) 0xffffffffffffffffUL);
    

    If you actually want the maximum value for a signed long, you should use:

    // Java
    private long l = Long.MAX_VALUE;
    // C#
    private long l = long.MaxValue;
    
    0 讨论(0)
提交回复
热议问题