Целочисленное переполнение:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(int argc, char *argv[]) {
int i = 1500;
int32_t i32 = 1500;
uint32_t u32 = 1500;
printf("i : %lf\n", (double)(i*i*i*i));
printf("i32: %lf\n", (double)(i32*i32*i32*i32));
printf("u32: %lf\n", (double)(u32*u32*u32*u32));
long int li = 1500;
int64_t i64 = 1500;
uint64_t u64 = 1500;
printf("li : %lf\n", (double)(li*li*li*li));
printf("i64: %lf\n", (double)(i64*i64*i64*i64));
printf("u64: %lf\n", (double)(u64*u64*u64*u64));
return(0);
}
Вывод на мой Linux x86_64 с GCC 8:
$ ./dummy
i : -1266441984.000000
i32: -1266441984.000000
u32: 3028525312.000000
li : 5062500000000.000000
i64: 5062500000000.000000
u64: 5062500000000.000000