Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.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++ 为什么可以';t I将一个大数字除以一个负数C++;_C++_Largenumber_Unsigned Long Long Int - Fatal编程技术网

C++ 为什么可以';t I将一个大数字除以一个负数C++;

C++ 为什么可以';t I将一个大数字除以一个负数C++;,c++,largenumber,unsigned-long-long-int,C++,Largenumber,Unsigned Long Long Int,没有必要解决这个问题,我只是想知道为什么。 让我们看两个数字: #include <iostream> using namespace std; int main() { unsigned long long int a = 17446744073709551615; signed long long int b = -30000000003; signed int c; c = a/b; cout << "\n\n\n" <

没有必要解决这个问题,我只是想知道为什么。 让我们看两个数字:

#include <iostream>
using namespace std;

int main()
{
    unsigned long long int a = 17446744073709551615;
    signed long long int b = -30000000003;
    signed int c;
    c = a/b;
    cout << "\n\n\n" << c << endl;
}
#包括
使用名称空间std;
int main()
{
无符号长整型a=17446744073709551615;
有符号长整型b=-300000000003;
署名INTC;
c=a/b;

coutb被视为大于a的无符号数。因此,您得到的答案是0

试着把它当作

c = abs(a) / abs (b)
if ((a < 0 && b > 0 ) || (a> 0 && b < 0))
   return -c;
return c;
c=abs(a)/abs(b)
如果((a<0&&b>0)| |(a>0&&b<0))
返回-c;
返回c;

b被视为大于a的无符号数字。因此,您得到的答案是0

试着把它当作

c = abs(a) / abs (b)
if ((a < 0 && b > 0 ) || (a> 0 && b < 0))
   return -c;
return c;
c=abs(a)/abs(b)
如果((a<0&&b>0)| |(a>0&&b<0))
返回-c;
返回c;

发生了许多隐式转换,其中大多数都是不必要的

unsigned long long int a = 17446744073709551615;
无前缀十进制整数文字的类型为
int
long int
long-long int
;它从来不是无符号类型。该特定值几乎肯定会超过
long-long int
的最大值(263-1)。除非编译器的有符号整数类型大于64位,否则会导致程序格式错误

添加
ULL
后缀以确保文字类型正确:

unsigned long long int a = 17446744073709551615ULL;
该值恰好介于263-1和264-1之间,因此适合64位无符号类型,但不适合64位有符号类型

(实际上,只需
U
就足够了,但明确无误。)

这应该不是问题。
300000000003
是某种有符号整数类型;如果您的编译器支持
long-long
(至少64位宽),则不会出现溢出。不过,只要在
a
的值上需要一个后缀,那么显式化也不会有什么坏处:

signed long long int b = -30000000003LL;
现在我们有:

signed int c;
c = a/b;
无符号长
除以
有符号长
会导致有符号操作数转换为
无符号长
。在这种情况下,转换的值为负值,因此会转换为较大的正值。将
-300000000003
转换为
无符号长
会产生
18446744043709551613
。将
17446744073709551615
除以
1844674404370951613
得到零

除非您的编译器支持大于64位的整数(大多数不支持),否则您将无法将
17446744073709551615
直接除以
-300000000003
,并获得数学上正确的答案,因为没有可以同时表示这两个值的整数类型。所有算术运算符(移位运算符除外)需要相同类型的操作数,并根据需要应用隐式转换

unsigned long long int a = 17446744073709551615;
在这种特殊情况下,您可以将
17446744073709551615ULL
除以
300000000003ull
,然后计算符号。(检查负整数除法的语言规则。)


如果通常确实需要这样做,可以使用浮点运算(这意味着您可能会失去一些精度)或使用任意宽度的整数算术包,如。

您有许多隐式转换发生,其中大多数是不必要的

unsigned long long int a = 17446744073709551615;
无前缀十进制整数文字的类型为
int
long int
long-long int
;它从来不是无符号类型。该特定值几乎肯定会超过
long-long int
的最大值(263-1)。除非编译器的有符号整数类型大于64位,否则会导致程序格式错误

添加
ULL
后缀以确保文字类型正确:

unsigned long long int a = 17446744073709551615ULL;
该值恰好介于263-1和264-1之间,因此适合64位无符号类型,但不适合64位有符号类型

(实际上,只需
U
就足够了,但明确无误。)

这应该不是问题。
300000000003
是某种有符号整数类型;如果您的编译器支持
long-long
(至少64位宽),则不会出现溢出。不过,只要在
a
的值上需要一个后缀,那么显式化也不会有什么坏处:

signed long long int b = -30000000003LL;
现在我们有:

signed int c;
c = a/b;
无符号长
除以
有符号长
会导致有符号操作数转换为
无符号长
。在这种情况下,转换的值为负值,因此会转换为较大的正值。将
-300000000003
转换为
无符号长
会产生
18446744043709551613
。将
17446744073709551615
除以
1844674404370951613
得到零

除非您的编译器支持大于64位的整数(大多数不支持),否则您将无法将
17446744073709551615
直接除以
-300000000003
,并获得数学上正确的答案,因为没有可以同时表示这两个值的整数类型。所有算术运算符(移位运算符除外)需要相同类型的操作数,并根据需要应用隐式转换

unsigned long long int a = 17446744073709551615;
在这种特殊情况下,您可以将
17446744073709551615ULL
除以
300000000003ull
,然后计算符号。(检查负整数除法的语言规则。)


如果通常确实需要这样做,可以使用浮点(这意味着您可能会失去一些精度)或者使用一些任意宽度的整数算术包,如。

为什么需要如此大且无意义的数字?我的猜测是,除法是作为无符号长整除完成的,即b变成一个非常大的无符号长整除。因此结果为0。首先尝试将
a
转换为
有符号长整除。
用于17446744073709551615,警告:整数常量大于最大的有符号整数类型。如果修复此问题,并将其强制转换为有符号