How to use Cshort in Julia

I have a 16-bit hex string a = "4E1A". How to convert a to signed short integer using Cshort. No example usage is found for Cshort.

julia> reinterpret(Int16,[0x4E1A])
1-element reinterpret(Int16, ::Vector{UInt16}):
19994

julia> 10 + 1*16 + 14 * 16^2 + 4 * 16^3
19994

How to convert a = “4E1A” to 0x4E1A

julia> parse(Int, "4E1A", base=16)
19994
julia> parse(Int16, "4E1A", base=16)
19994

Do you want to parse it?

julia> parse(UInt16, "4E1A"; base=16)
0x4e1a
1 Like

julia> parse(Int16, “F1CF”, base=16)
ERROR: OverflowError: overflow parsing “F1CF”
Stacktrace:
[1] tryparse_internal(#unused#::Type{Int16}, s::String, startpos::Int64, endpos::Int64, base_::Int64, raise::Bool)
@ Base .\parse.jl:163
[2] parse(::Type{Int16}, s::String; base::Int64)
@ Base .\parse.jl:241
[3] top-level scope
@ REPL[4]:1

That’s because this is larger than the largest positive Int16. If you want to “wrap it around” to a negative Int16 value with those bytes via 2’s complement, do:

julia> parse(UInt16, "F1CF"; base=16) % Int16
-3633
1 Like

There’s nothing special or different about Cshort. The only reason you’d ever want to use it is for interop with a C program that uses the definition of short. Otherwise, it’s much better to simply use Int16 directly as folks here are assuming because it seems you know that it’s two bytes (or four hex digits).

Why “F1CF” is larger than largest positive Int16 (32767). Is it by convention. Can you please explain. There are total 2^16 different values possible with Int16. Of which many are causing overflow error. How can I find out which possible values are causing overflow error.

C short is a 16-bit signed integer (as is Int16) and so it can store values in the range -2^15 to 2^15-1. That is, the largest positive value is 7FFF.

A C unsigned short is equivalent to a UInt16 and can store values from 0 to 2^16-1 (ie up to FFFF).

2 Likes