我刚刚回答 this question ,它问为什么在 for 循环中迭代到 100 亿比迭代到 10 亿需要更长的时间(OP 实际上在 10 分钟后中止了它):
for (i = 0; i < 10000000000; i++)
现在我和许多其他人的明显答案是,这是由于迭代变量是 32 位(永远不会达到 100 亿)并且循环进入无限循环。
虽然我意识到了这个问题,但我仍然想知道编译器内部到底发生了什么?
由于文字没有附加 L,恕我直言,它也应该是 int 类型,因此是 32 位的。因此,由于溢出,它应该是可访问范围内的正常 int 。要真正识别出它无法从 int 得到,编译器需要知道它是 100 亿,因此将其视为超过 32 位的常量。
即使没有附加 L,这样的文字是否会自动提升到合适的(或至少是实现定义的)范围(在这种情况下至少为 64 位)?标准行为?还是在幕后发生了一些不同的事情,例如由于溢出而导致的 UB(整数溢出实际上是 UB)?如果有的话,标准中的一些引用可能很好。
虽然最初的问题是 C,但如果有任何不同,我也很欣赏 C++ 的答案。
最佳答案
就 C++ 而言:
C++11,[lex.icon] ¶2
The type of an integer literal is the first of the corresponding list in Table 6 in which its value can be represented.
而表 6,对于没有后缀和十进制常量的文字,给出:
int
long int
long long int
(有趣的是,对于十六进制或八进制常量,unsigned 类型也是允许的 - 但每个类型都在列表中对应的有符号类型之后)
因此,很明显,在这种情况下,常量已被解释为 long int(或 long long int,如果 long int 是太 32 位)。
注意“字面量太大”会导致编译错误:
A program is ill-formed if one of its translation units contains an integer literal that cannot be represented by any of the allowed types.
(同上,¶3)
立即看到in this sample ,这提醒我们 ideone.com 使用 32 位编译器。
我现在看到问题是关于 C 的……嗯,差不多是一样的:
C99,§6.4.4.1
The type of an integer constant is the first of the corresponding list in which its value can be represented.
列表与 C++ 标准中的相同。
附录:如果其他一切都失败了,C99 和 C++11 都允许文字为“扩展整数类型”(即其他特定于实现的整数类型)。 (C++11,[lex.icon] ¶3;C99,§6.4.4.1 ¶5 在表格之后)
关于c++ - 默认情况下整数文字的类型不是 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108642/
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我有一大串格式化数据(例如JSON),我想使用Psychinruby同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳