No, it's not interpreted differently. In 2's complement arithmetic,
addition is the same operation on the underlying bits, whether the number
is signed or unsigned. The same goes for negation and subtraction. There is
a difference if you consider overflow, but Go doesn't have overflow of the
integer types; they "wrap around" instead.

It so happens that if you look at the underlying bits, -x performs the
exact same transformation on the bits as (~x+1). So they really end up
being the same operation for signed and unsigned numbers. The "overflow"
you're seeing is just a result of the way constants are handled in Go. The
compiler detects overflow when you try to store a constant that's out of
range into a variable, but overflow doesn't occur at runtime, only
wraparound (all integer math is modulo 2^n for some n=8, 16, 32, or 64).
Dividing (or modulo) by 0 is the only integer math that can fail at
runtime, causing a panic.

On Tue, Jul 25, 2017 at 8:17 PM Pablo Rozas Larraondo <
p.rozas.larrao...@gmail.com> wrote:

> Ok, I might be understanding this differently then:
>
> The -1 * x operation cannot be defined for unsigned integers as -1
> overflows. Therefore, -x in the case of unsigned types is interpreted
> differently by the compiler, resulting in a ^x + 1 operation. Is that a
> correct assumption?
>
> By the way, yes, the title should say Bit instead of Byte, sorry about the
> confusion.
>
> On Wed, Jul 26, 2017 at 11:35 AM, Matt Harden <matt.har...@gmail.com>
> wrote:
>
>> Both statements are true for both signed and unsigned integers.
>>
>> On Mon, Jul 24, 2017, 04:11 Pablo Rozas Larraondo <
>> p.rozas.larrao...@gmail.com> wrote:
>>
>>> Thanks Bakul, I think I have a better understanding of what's going on
>>> after reading your response.
>>>
>>> Is it correct to say that the Go compiler treats the prepended minus
>>> sign differently depending on the variable being a signed or an unsigned
>>> integer?
>>>
>>> By looking at this example: https://play.golang.org/p/feqQsuPkqk
>>>
>>> It seems to me that in the case of an unsigned integer it's treated as a
>>> bitwise operation : -x == ^x + 1
>>> But for signed integers -x == -1 * x
>>>
>>> Cheers,
>>> Pablo
>>>
>>>
>>>
>>> On Mon, Jul 24, 2017 at 5:36 AM, Bakul Shah <ba...@bitblocks.com> wrote:
>>>
>>>> This is a standard trick to find the least significant set bit in a
>>>> word. Only works for 2's complement numbers!
>>>>     -x == ~x+1
>>>> For example: x = 00110000b (24), ~x+1 = 11001111+1 = 11010000. Adding
>>>> them yields 00010000; thus only the least significant set bit remains set.
>>>>
>>>> Note that func LSB(x uint64) uint64 { return x&-x } works too. In your
>>>> example you get an error because in Go literal constants are untyped. It is
>>>> a pragmatic decision -- see https://blog.golang.org/constants
>>>>
>>>> On Jul 23, 2017, at 5:50 AM, Pablo Rozas Larraondo <
>>>> p.rozas.larrao...@gmail.com> wrote:
>>>>
>>>> I have seen Go code using this function to find out the least
>>>> significant byte of unsigned integers:
>>>>
>>>> func LSB(ci uint64) uint64 { return uint64(ci) & -uint64(ci) }
>>>>
>>>> This function works fine but I wonder why, if call the same AND
>>>> operation, it results in an error: "constant -X overflows uint64"
>>>>
>>>> Here is a playground example to illustrate this:
>>>> https://play.golang.org/p/_0EYtlLnmG
>>>>
>>>> Does anyone know what changes when -uint64() is called in a return
>>>> statement? How a negative uint should be interpreted?
>>>>
>>>> Thank you,
>>>> Pablo
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "golang-nuts" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to golang-nuts+unsubscr...@googlegroups.com.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "golang-nuts" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to golang-nuts+unsubscr...@googlegroups.com.
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to