我想将 unsigned long 的 32 位重新解释为 signed long。完全相同的位,只是被视为 2 的补码整数而不是无符号整数。我不认为简单地将它转换为 long 就可以解决问题。我错了吗?
或者也许有更好的方法。我正在使用 unsigned long 作为计时器。有时我会读取它的当前值并将其与之前的读数(均为 unsigned long)进行比较,以查看过去了多少时间。我需要处理可能的溢出,这会导致当前值小于以前的值。将两个值都解释为带符号的长整型并相减似乎给出了正确的答案。
我试过这个:
return reinterpret_cast<long>(time4) - reinterpret_cast<long>(currTimeLo); // treat unsigned as 2's complement
但刚刚得到一个编译器错误:
Arduino: 1.6.7 (Mac OS X), Board: "Arduino Nano, ATmega328"
invalid cast from type 'long unsigned int' to type 'long int'
最佳答案
关于通过比较两个无符号计数器来检查经过了多少时间的更深层次/原始问题,其中可能有 1 个单一环绕:
使用无符号算术简单地从最新的减去最早的。
假设您的 currTimeLo 是当前时间的计数器值,而 time4 是某个更早的值,并且它们都是无符号类型(或有符号类型之一类型提升了另一个的无符号类型),
return currTimeLo - time4;
这是因为 C++ 保证无符号算术以 2n 为模执行,其中 n 是值表示中的位数无符号类型。
在超过 1 个环绕的情况下,此方法将不起作用。在这种情况下,您需要使用具有更大数字范围的类型。
关于题名将无符号值解释为2的补码有符号值的问题:
首先请注意,这不是必需的。这是 X/Y 问题中的 Y。获取两个计数器之间的差异,最新的可能已经包装,是原始的 X,它有一个简单的解决方案(上图)。
但是,既然这是标题中的问题:
据我所知,所有现存的 C++ 实现都适用于有符号整数使用 2 的补码表示的体系结构。
当原始值无法用该类型表示时,Holy Standard™ 将其留给实现来定义转换为有符号整数类型的结果。任何合理的 C++ 实现都会让您通过 static_cast 来完成。因此,
return static_cast<long>(time4) - static_cast<long>(currTimeLo);
但是不能保证您在 Arduino 中的编译器在这方面是合理的。
你将不得不检查它,并在必要时使用相关选项,假设默认情况下不合理的行为可以调整。
解决方法包括
通过reinterpret_cast 转换指针或引用,
通过例如复制字节memcpy,形式上安全但复杂且不必要地可能效率低下,
使用正式的 UB union 成员访问权限,或
安全但复杂,拆分值并重新组合。
最后一点可以用一种近乎优雅的方式来完成,有人在 SO 上早先针对这个问题的语言律师变体发表了回应。不幸的是,我不记得那个把戏,只记得它给我留下了深刻的印象,因为它是如此明显,但却是我没有想到的。但我推荐经过适当测试的简单 static_cast。
关于c++ - 将无符号(长)整数解释为在 C++ 中签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35108622/
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac
啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组
我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/
我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195