在Go语言中进行颜色操作。

huangapple go评论79阅读模式
英文:

Color operation in go

问题

这里有一些简单的颜色操作,但输出结果是错误的。我想知道这里发生了什么。

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)
}

输出结果:

201-235=222
英文:

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

答案1

得分: 2

color.RGBA.G 是一个 uint8 类型。由于 235 大于 201,但是 uint8 类型不能存储负数,比如 -34,所以该值会进行循环。在这种情况下,与 color 无关。你可以通过以下代码得到相同的结果(222):

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

所以这并没有什么特别之处,只是标准的 Go 无符号整数溢出循环。甚至这都不是未定义行为。

英文:

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.

huangapple
  • 本文由 发表于 2022年3月12日 22:56:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/71450623.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定