почему переполнение происходит при расчете в зависимости от типа данных, когда тип, которому присваивается значение, может содержать его

Раньше я придумывал что-то, что я решил, но позже мне это удалосьВзгляните на похожий пример того, на чем я был:

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

Выход: 4294967260

Я просто поменялаa вunsigned long и правильный выход 85% будет расти, потому чтоa 32-разрядное целое число со знаком Но это досталось мне позже. Нет присвоения значенияa в течение( 100 * a ) есть просто расчет, и вместо переполнения должно появиться правильное значение, которое составляет 3 миллиарда. Чтобы понять, если не былот действительно заданиеa Я удалилa из кода и вместо этого вручную запишите значение:

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

Большим сюрпризом стало то, что на выходе также: 4294967260

И, конечно, стоимость 3 миллиарда может быть назначена наunsigned long, Моя первая мысль была, что( 100 * 30000000 ) вызывал переполнение, но потом я спросилпереполнение на что? нечего переполняться, Потом я поменялb на unsigned long, что даже на удивление было правильным на 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;

Ответы на вопрос(5)

Ваш ответ на вопрос