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