Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 十六进制加法和减法_C++_Hex - Fatal编程技术网

C++ 十六进制加法和减法

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 =

到目前为止,我有这个代码。当我把两个负整数相加时,答案是正的而不是负的。我该如何解决这个问题? 我认为0x8000000是整数的最小可能值

#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
是什么。这是最小值。