On Sat, Sep 5, 2015 at 11:57 PM, <ele...@gmail.com> wrote: > > Subtlty of C, literal integer constants are signed, so s is converted to > signed before the % and so the whole abs is signed.
And in any case abs in c is `int abs(int);` so the argument is always converted to signed integer before passing to `abs`. > > > On Sunday, September 6, 2015 at 1:23:46 PM UTC+10, Corey Moncure wrote: >> >> I see... It's actually a Uint, not a Uint8 that is passed to f(), but the >> result is the same. I'm running into a lot of traps like this. Consider >> the following analogous C code: >> >> int f () { >> unsigned int s = 4; >> int a; >> a = abs((s % 3) - 3); >> printf("a: %d", a); >> return a; >> } >> >> The C compiler has no trouble evaluating the abs(...) the way it's >> intended even though 's' is clearly typed as an unsigned int. What's going >> on in Julia? It's like in Julia world we aren't allowed to ask what 2 - 3 >> evaluates to if 2 is an unsigned type, regardless of what type we would >> store the result in? >> >> >> >> On Saturday, September 5, 2015 at 10:57:01 PM UTC-4, Seth wrote: >>> >>> You're passing a UInt8 to f() which results in a mod of >>> 0x0000000000000001, from which 3 is subtracted resulting in >>> 0xfffffffffffffffe return value. Casting that to an Int, you get -2. >>> >>> Try f(UInt8(4)) to see this in action. >>> >>> In 0.4, your test_abs() example results in an InexactError. >>> >>> On Saturday, September 5, 2015 at 7:31:35 PM UTC-7, Corey Moncure wrote: >>>> >>>> Can someone help me understand what's going on here? >>>> Maybe I've been sitting at my desk too long? >>>> >>>> julia> arr = hex2bytes("14fb9c03") >>>> 4-element Array{Uint8,1}: >>>> 0x14 >>>> 0xfb >>>> 0x9c >>>> 0x03 >>>> >>>> julia> f(x) = abs((x % 3) - 3) >>>> f (generic function with 1 method) >>>> >>>> julia> function test_abs(bytes_input::Array{Uint8}) >>>> input_len::Uint = sizeof(bytes_input) >>>> a::Int = f(input_len) >>>> println("a: ", a, " input len: ", input_len) >>>> end >>>> test_abs (generic function with 1 method) >>>> >>>> julia> test_abs(arr) >>>> a: -2 input len: 4 <-- minus 2???? >>>> >>>> julia> sizeof(arr) >>>> 4 >>>> >>>> julia> f(4) >>>> 2 <-- expected >>>> >>>> >>>> >>>> >