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,警告:整数常量大于最大的有符号整数类型。如果修复此问题,并将其强制转换为有符号