早些时候我想出了一些东西,我解决了,但后来让我看一个类似的例子:
int b = 35000000; //35million
int a = 30000000;
unsigned long n = ( 100 * a ) / b;
输出:4294967260
我只是更改a
为unsigned long
,然后会出现正确的 85% 输出,因为a
它是一个有符号的 32 位整数。但这让我后来。a
期间没有赋值,( 100 * a )
只是简单的计算,应该出现正确的值,即 30 亿,而不是溢出。要了解是否真的没有分配给a
我,我a
从代码中删除并改为手动写入值:
int b = 35000000;
unsigned long n = ( 100 * 30000000 ) / b;
最大的惊喜是输出也是: 4294967260
当然可以将 30 亿的值分配给unsigned long
. 我的第一个想法是( 100 * 30000000 )
导致溢出,但后来我问“溢出什么?没有什么可以溢出”。然后我改成b
无符号长,甚至最令人惊讶的是输出正确率为 85%。
在第一个示例中更改a
为unsigned long
int b = 35000000;
unsigned long a = 30000000;
unsigned long n = ( 100 * a ) / b;
并保持b
原样int
工作,但在第二个例子中它没有,发生了什么?
让我用工作的和不工作的重新编写所有示例,这可能有点压倒性。
作品(输出 = 85):
int b = 35000000;
unsigned long a = 30000000;
unsigned long n = ( 100 * a ) / b;
作品(输出 = 85):
unsigned long b= 35000000;
unsigned long n = ( 100 * 30000000 ) / b;
不起作用(溢出):
int b = 35000000;
int a = 30000000;
unsigned long n = ( 100 * a ) / b;
不起作用(溢出):
int b = 35000000;
unsigned long n = ( 100 * 30000000 ) / b;