почему переполнение происходит при расчете в зависимости от типа данных, когда тип, которому присваивается значение, может содержать его
Раньше я придумывал что-то, что решил, но позже давайте рассмотрим похожий пример того, на чем я был:
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
.
My first thought was that ( 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;