C++ 十六进制加法和减法
到目前为止,我有这个代码。当我把两个负整数相加时,答案是正的而不是负的。我该如何解决这个问题? 我认为0x8000000是整数的最小可能值C++ 十六进制加法和减法,c++,hex,C++,Hex,到目前为止,我有这个代码。当我把两个负整数相加时,答案是正的而不是负的。我该如何解决这个问题? 我认为0x8000000是整数的最小可能值 #include <iostream> #include <string> using namespace std; int main(void) { unsigned int maxInt = 0x7FFFFFFF; int num1 = 7; signed int minInt = 0x80000000; int num2 =
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
unsigned int maxInt = 0x7FFFFFFF;
int num1 = 7;
signed int minInt = 0x80000000;
int num2 = -21;
float num3 = 1;
float i;
cout<<"The value of the first variable is: "<<maxInt<<endl;
cout<<"The value of the second variable is: "<< num1<<endl;
cout<<"Addition of the two numbers: "<< maxInt + num1 <<endl;
cout<<endl;
cout<<"The value of the first variable is: "<<minInt<<endl;
cout<<"The value of the second variable is "<<num2<<endl;
cout<<"Addition of the two numbers: "<< minInt + num2 <<endl;
cout<<endl;
system("pause");
return 0;
}
#包括
#包括
使用名称空间std;
内部主(空)
{
无符号整数maxInt=0x7FFFFFFF;
int num1=7;
有符号整数最小值=0x8000000;
int num2=-21;
浮点数m3=1;
浮点数i;
cout将0x80000000和-21相加,得到的结果是0x7FFFFFDF。这个十进制数字是2147483615。发生这种情况是因为最左边的位用于确定符号。您将得到一个下溢,在这种情况下,下溢环绕到最大整数并从那里开始倒计时。添加tw时,同样的情况也会发生o个正整数,除了它是无符号的,所以会环绕到0,但当您溢出或下溢时,它是未定义的行为
正如评论所说,您可以使用更大的类型:
int64_t result = static_cast<int64_t>(maxInt) + num1;
int64_t result2 = static_cast<int64_t>(minInt) - num2;
int64\u t result=static\u cast(maxInt)+num1;
int64\u t result2=静态强制转换(minInt)-num2;
输出是什么?您期望它是什么?如果不修复它,将负数添加到minInt
将产生超出范围的结果,加法溢出,这是未定义的行为。从minInt
中进行任何减法都将导致下溢,下溢将表示为正数。您无法使用int
s,因为没有足够的位。您需要一个具有更多位的数据类型(例如longlong
)。您正在滚动。这是人们使用固定宽度整数表示法的症结所在。如何解决它?使用较小的数字或增加用于表示这些数字的位数(例如long)。当你取一个可能的最大整数并向该值加上一个正整数时,假设它环绕到最大的最小整数并从那里倒计时?我得到的结果是2147483654,因为2147483647是可能的最大整数。很好的解释。你能回答问题的第二部分吗:“我如何解决这个问题?”@AdamLiss,正式指出。我为它添加了一些代码,类型保证为64位以保存结果。-1.示例是错误的。溢出将在分配给更长的类型之前发生。哎呀。当您获取可能的最大整数并向该值添加一个正整数时,它将环绕到最大的最小整数并倒计时从那里?我得到的结果是2147483654,因为2147483647是可能的最大值integer@user1251302,溢出和下溢是未定义的行为,但大多数情况下,由于位的表示方式,您会看到它们缠绕在一起。0x7FFFFFFF+1=0x8000000
现在猜猜0x8000000
是什么。这是最小值。