在 another question ,话题std::numeric_limits<int>::is_modulo上来了。但我想得越多,就越觉得规范或 GCC 或两者都有问题。
让我从一些代码开始:
#include <limits>
#include <iostream>
bool test(int x)
{
return x+1 > x;
}
int main(int argc, char *argv[])
{
int big = std::numeric_limits<int>::max();
std::cout << std::numeric_limits<int>::is_modulo << " ";
std::cout << big+1 << " ";
std::cout << test(big) << "\n";
}
当我用 g++ -O3 -std=c++11 编译它时(x86_64 GCC 4.7.2),它会产生以下输出:
1 -2147483648 1
也就是说,is_modulo是真的,一加INT_MAX是负数,加一 INT_MAX大于 INT_MAX .
如果您是那种有实际机会回答这个问题的人,那么您已经知道这里发生了什么。 C++ 规范说整数溢出是未定义的行为;允许编译器假设您不这样做;因此,x+1 的论点不能是 INT_MAX ;因此编译器可能(并且将会)编译 test返回函数true无条件地。到目前为止,一切顺利。
但是,C++11 spec还说(18.3.2.4 第 60-61 段):
static constexpr is_modulo;True if the type is modulo.222 A type is modulo if, for any operation involving
+,-, or*on values of that type whose result would fall outside the range[min(),max()], the value returned differs from the true value by an integer multiple ofmax() - min() + 1.On most machines, this is
falsefor floating types,truefor unsigned integers, andtruefor signed integers.
请注意,第 5 节第 (4) 段仍然写道,“如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。”没有提到is_modulo == true创建一个异常。
所以在我看来,标准在逻辑上是矛盾的,因为整数溢出不能同时定义和未定义。或者至少,GCC 是不合格的,因为它有 is_modulo作为 true即使有符号算术肯定不会环绕。
是标准的 buggy 吗? GCC 不合格吗?我错过了什么吗?
最佳答案
如果 is_modulo 对于有符号类型(例如 int)是 true 且不会被通常的算术转换更改,那么对于任何算术运算除了除以零之外,在(数学)整数中有一个正确的结果,该整数模映射到类型范围内的单个值,因此实现被限制为好像实际结果是模数的真实结果类型的范围。因此,如果一个实现想要将溢出算法保留为未定义,它必须将 is_modulo 设置为 false。
这是在 gcc 邮件列表中讨论过的,令人作呕,然后在 PR 22200 下进行了讨论。最终的结论是 is_modulo 的值应该是 false 对于有符号类型; the change是今年四月做成 libstdc++ 的。
请注意,在 C++03 中,语言明显不同:
18.2.1.2 numeric_limits members [lib.numeric.limits.members]56 - [...] A type is modulo if it is possible to add two positive numbers and have a result that wraps around to a third number that is less.
鉴于未定义的行为 任何事情 都是可能的,因此可以说 libstdc++ 的先前行为(将 is_modulo 设为 true)是正确的并且符合g++的行为;阅读之前关于链接 PR 的讨论时应牢记这一点。
关于c++ - numeric_limits<int>::is_modulo 在逻辑上是否矛盾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13272959/
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request
我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll
如何将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.你能做的最好的事情是:
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我正在尝试使用“updated_at”字段的日期时间范围查询数据库。前端在JSON数组中发送查询:["2015-09-0100:00:00","2015-10-0223:00:00"]在RailsController中,我使用以下方法将两个字符串解析为DateTime:start_date=DateTime.parse(params[:date_range_arr][0])end_date=DateTime.parse(params[:date_range_arr][1])#...@events=@events.where('updated_atBETWEEN?AND?,start_d