我有一个包含负数的 int64 变量,我想从一个包含正数的 uint64 变量中减去它:
var endTime uint64
now := time.Now().Unix()
endTime = uint64(now)
var interval int64
interval = -3600
endTime = endTime + uint64(interval)
上面的代码似乎可以工作,但我想知道我是否可以依赖它。我很惊讶,作为 Go 的新手,在将负数转换为 uint64 后它仍然是负数——我曾计划减去现在的正值(转换后)以获得我想要的结果。
最佳答案
将有符号数转换为无符号数不会保持负数,它不能,因为无符号类型的有效范围不包括负数。如果您打印 uint(interval),您肯定会看到打印出一个正数。
您的体验是确定性的,您可以依赖它(但这并不意味着您应该依赖它)。这是 Go(和大多数其他编程语言)使用 2's completement 存储有符号整数类型的结果。代表。
这意味着在负数的情况下,使用 n 位,值 -x(其中 x 为正)存储为正值 2^n - x 的二进制表示。这样做的好处是数字可以按位相加,无论是负数还是正数,结果都是正确的。
所以当你有一个带符号的负数时,它基本上存储在内存中,就像你从 0 中减去它的绝对值一样。这意味着如果您将负的有符号值转换为无符号值,并将其添加到无符号值,结果将是正确的,因为会以一种有用的方式发生溢出。
将 int64 类型的值转换为 uint64 不会改变内存布局,只会改变类型。那么 int64 有 8 个字节,转换后的 uint64 将有相同的 8 个字节。并且如上所述,存储在这 8 个字节中的表示是与值 0 - abs(x) 的位模式相同的位模式。因此,转换的结果将是一个数字,如果您在无符号世界中从 0 中减去 abs(x),就会得到这个数字。是的,这不会是负数(因为类型是无符号的),而是一个“大”数,从 uint64 类型的最大值开始倒数。但是如果你给这个“大”数加上一个大于abs(x)的y数,就会发生溢出,结果会像y - abs (x).
请看这个演示正在发生的事情的简单示例(在 Go Playground 上尝试):
a := uint8(100)
b := int8(-10)
fmt.Println(uint8(b)) // Prints 226 which is: 0 - 10 = 256 - 10
a = a + uint8(b)
fmt.Println(a) // Prints 90 which is: 100 + 226 = 326 = 90
// after overflow: 326 - 256 = 90
如上所述,您不应依赖于此,因为这可能会造成混淆。如果您打算使用负数,请使用带符号的类型。
如果您使用的代码库已经使用 uint64 值,则使用 uint64 值执行减法而不是加法:
interval := uint64(3600)
endTime -= interval
另请注意,如果您有 time.Time值(value)观,你应该利用它的Time.Add()方法:
func (t Time) Add(d Duration) Time
您可以指定 time.Duration添加时间,如果你想回到过去,这可能是负面的,就像这样:
t := time.Now()
t = t.Add(-3600 * time.Second)
time.Duration 更具表现力:我们看到上面指定的值明确使用秒数。
关于go - 将 int64 转换为 uint64 时,符号是否保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50815512/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查