英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论