¿Por qué el desbordamiento ocurre en el cálculo dependiendo del tipo de datos cuando el tipo al que se asigna el valor puede contenerlo?

Anteriormente se me ocurrió algo que resolví, pero luego me convenció de que echamos un vistazo a un ejemplo similar de lo que estaba viendo:

int b = 35000000; //35million
int a = 30000000;
unsigned long n = ( 100 * a ) / b;

Salida: 4294967260

Simplemente cambiéa aunsigned long y la salida correcta del 85% saldría, porquea es un entero de 32 bits con signo. Pero esto me consiguió más tarde. No hay asignación de valor paraa durante( 100 * a ) simplemente hay un cálculo y el valor correcto que es 3billion debería aparecer en lugar de un desbordamiento. Para entender si realmente no había una tarea paraa quitea a partir del código y escriba el valor manualmente en su lugar:

int b = 35000000;
unsigned long n = ( 100 * 30000000 ) / b;

La gran sorpresa fue que la salida también es: 4294967260.
Y, por supuesto, el valor de 3billion se puede asignar a ununsigned long. Mi primer pensamiento fue que( 100 * 30000000 ) causaba un desbordamiento, pero luego pregunté "¿un desbordamiento sobre qué? No hay nada que desbordar". Entonces cambiéb a largo sin firmar, que incluso más sorprendentemente la salida fue correcta 85%.

En el primer ejemplo cambiando.a aunsigned long

int b = 35000000;
unsigned long a = 30000000;
unsigned long n = ( 100 * a ) / b;

y dejandobcomo unint Como funciona, pero en el segundo ejemplo no es así, ¿qué está ocurriendo?

Esto podría ser un poco abrumador para dejarme reescribir todos los ejemplos con los que trabajan y los que no.

Trabajos (Salida = 85):

int b = 35000000;
unsigned long a = 30000000;
unsigned long n = ( 100 * a ) / b;

Trabajos (Salida = 85):

unsigned long b= 35000000;
unsigned long n = ( 100 * 30000000 ) / b;

No funciona (Desbordamiento):

int b = 35000000;
int a = 30000000;
unsigned long n = ( 100 * a ) / b;

No funciona (Desbordamiento):

int b = 35000000;
unsigned long n = ( 100 * 30000000 ) / b;

Respuestas a la pregunta(5)

Su respuesta a la pregunta