Hi,
What is the equivalent in Julia of 0x8000000000000000ull which is sometimes used in C?
Example in C someone could write :
(x >> 63) | 0x8000000000000000ull
Assuming uint64_t x.
Thank you
Hi,
What is the equivalent in Julia of 0x8000000000000000ull which is sometimes used in C?
Example in C someone could write :
(x >> 63) | 0x8000000000000000ull
Assuming uint64_t x.
Thank you
You need to use Culonglong(0x8000000000000000).
I’m not sure anything particular is required for such cases? For example:
julia> x = typemax(UInt64)
0xffffffffffffffff
julia> (x >> 63) | 0x8000000000000000
0x8000000000000001
In Julia integer literal are automatically given a “big enough” type, at least up to 128-bit. So 0x8000000000000000 is a UInt64. You can request a specific type by writing e.g. UInt128(0x8000000000000000). But you get UInt128 automatically if you write a larger literal integer:
julia> typeof(0x1000000000000000000000000000000)
UInt128
I am confused now
So which one is the correct answer:
Culonglong(0x8000000000000000)
0x8000000000000000
Or
UInt64(0x8000000000000000)
It seems they all work
The shortest correct answer, assuming you want UInt64, is simply 0x8000000000000000.
As @sijo explained, the type of an integer literal 0x.... in Julia is determined by the number of digits, so there is no need for suffixes. For example, 0x80 is a UInt8, 0x8000 is UInt16, and 0x80000000 is a UInt32.
(If you need a C unsigned long long specifically, you might want to cast it to Culonglong explicitly in case Culonglong is different from a UInt64, but I’m not aware of any supported platform where this is the case. Moreover, the values are converted on assignment anyway, e.g. if you have a ccall with a Culonglong argument or a struct with a Culonglong field to mirror a C type then you can just pass/assign a UInt64 and it will get converted if needed.)