Iva*_*van 0 c++ 64-bit overflow
我编写了一个将十进制数转换为二进制数的函数.我输入我的十进制数字作为long long int.它适用于小数字,但我的任务是确定计算机如何处理溢出,所以当我输入(2 ^ 63) - 1时,函数输出十进制值为9223372036854775808,二进制值等于-954437177.当我输入2 ^ 63这是64位机器无法保持的值时,我得到警告:整数常量太大而无符号且十进制常数仅在ISO C90和十进制输出中无符号值为负2 ^ 63,二进制数为0.我使用gcc作为编译器.这个结果是否正确?
代码如下:
#include <iostream>
#include<sstream>
using namespace std;
int main()
{
long long int answer;
long long dec;
string binNum;
stringstream ss;
cout<<"Enter the decimal to be converted:"<< endl;;
cin>>dec;
cout<<"The dec number is: "<<dec<<endl;
while(dec>0)
{
answer = dec%2;
dec=dec/2;
ss<<answer;
binNum=ss.str();
}
cout<<"The binary of the given number is: ";
for (int i=sizeof(binNum);i>=0;i--){
cout<<binNum[i];}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
首先,"在64位计算机上"是没有意义的:long long无论计算机如何,都保证至少64位.如果可以将现代C++编译器压到Commodore 64或Sinclair ZX80上,或者就KIM-1而言,a long long仍然至少为64位.这是C++标准给出的与机器无关的保证.
其次,指定过大的值是不一样的"溢出".
让这个问题变得有趣的唯一一点就是存在差异.并且该标准对这两种情况的处理方式不同.对于使用整数值初始化有符号整数的情况,如果需要,将执行转换,如果无法表示值,则使用实现定义的效果,...
C++11§4.7/ 3:"如果目标类型是有符号的,如果它可以用目标类型(和位字段宽度)表示,则值不变; 否则,该值是实现定义的"
而对于例如乘法产生不能由参数类型表示的值的情况,效果是未定义的(例如,甚至可能崩溃)......
C++11§5/ 4:"如果在评估表达式期间,结果未在数学上定义或未在其类型的可表示值范围内,则行为未定义."
关于代码II,只有在编写了上面的代码之后才发现它,但看起来它确实会产生足够大数量的溢出(即未定义行为).把你的数字放在vector或string.请注意,您也可以使用a bitset来显示二进制数字.
哦,KIM-1.没有多少人熟悉它,所以这是一张照片:

据报道,尽管键盘有些受限制,它仍然非常好.