首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于uint8、int8的算法

基于uint8、int8的算法
EN

Stack Overflow用户
提问于 2019-02-09 11:11:01
回答 2查看 1.3K关注 0票数 0

在给定的示例中,对unit8int8数据类型的算术运算得到负和零的原因是什么?

代码语言:javascript
复制
package main

import (
    "fmt"
)

func main() {

     var u uint8 = 255
     fmt.Println(u, u+1, u*u) // "255 0 1"
     var i int8 = 127
     fmt.Println(i, i+1, i*i) // "127 -128 1"
}

a2KHP29t5p

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-09 15:30:09

如另一个答案所示,与其他一些编程语言不同,Go以一种定义良好的方式处理所有整数溢出,类似于当前大多数CPU在程序集级别上发生的情况。

127 = 0111 1111二进制

+1= 1000 000二进制

被解释为有符号2的补码8位整数的是-128。

255 =11111111二进制

+1=10 0000二进制(注9位)

如果我们有9位,那就是256,但是我们没有,我们只有8,所以它变成0000二进制,也就是0。

类似于乘法:

127*127 = 16129 =‭0011 1111 0000 0001‬bin

255 * 255 = 65025 =‭1111 1110 0000 0001‬bin

两者都有较低的8位,如0000 0001 bin =1。

注意:大多数情况下,如果您依赖于整数溢出,那么您应该后退一步,仔细考虑如果这是您正在做的事情的最佳方式。这是非常低层次的行为,涉及确切的位行为,并应始终与足够的评论解释什么和为什么。

票数 2
EN

Stack Overflow用户

发布于 2019-02-09 11:21:22

在运行时,Go不会对整数溢出感到恐慌。根据文档

对于无符号整数值,运算+、-、*和<<被计算为模2n,其中n是无符号整数类型的位宽。松散地说,这些无符号整数操作在溢出时丢弃高位数,程序可能依赖于“环绕”。 对于有符号整数,操作+、-、*、/和<<可能合法溢出,结果值存在并由有符号整数表示、操作及其操作数确定地定义。溢出不会引发任何异常。在不发生溢出的假设下,编译器可能不会优化代码。例如,它可能不会假设x

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54605650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档