Вы должны изменить свой второй пример кода как
int i0 = INT_MAX; //32-bit
int i1 = INT_MAX; //32 bit variable
long long ll = ((long long)i0)*i1; //compute and store in 64-bit variable
printf("%lld\n", ll);
, то есть приведите (хотя бы одну из) целых к 64-битному , прежде чем умножите их. В противном случае переполнение происходит из-за попытки сохранить результат во временном хранилище типа int
, прежде чем присвоить его переменной long long
. Результат любого выражения приводится к точности его члена с наивысшей точностью.
В первом примере int
достаточно большой, чтобы вместить результат умножения char
s, поэтому переполнения нет.
В качестве дополнительного примечания называть вашу переменную ll
не рекомендуется, поскольку очень трудно провести различие между цифрой «1» и строчной буквой «l».