Search code examples
gocolors

Color operation in go


There're some simple color operations, but the output is wrong. I'm just wondering what happened here.

main.c:

package main

import (
    "fmt"
    "image/color"
)

func main() {
    startColor := color.RGBA{0x34, 0xeb, 0x64, 0xff}
    endColor := color.RGBA{0x34, 0xc9, 0xeb, 0xff}
    fmt.Printf("%d-%d=%d\n", endColor.G, startColor.G, endColor.G-startColor.G)
}

output:

201-235=222

Solution

  • color.RGBA.G is a uint8. Since 235 is bigger than 201, but uint8 doesn't store negative numbers like -34, the value is instead wrapping.

    There's nothing color specific about the situation. You get the same answer (222) with:

        var g1, g2 uint8 = 0xc9, 0xeb
        fmt.Println(g1 - g2)
    

    So nothing unusual, just standard Go unsigned integer overflow wrapping. It isn't even undefined behavior.