What's the 'c' target? That's C code emitted by Clue. That is, we're compiling C into C. Clue's output code uses double precision floats for all numbers, but even then it's impressively fast.
To me that sounds like they're changing the program semantics. Switching to different types of floats will change your program.
I've just tried a simple case in which a program prints the output of an integer division and the output of an integer addition which overflows in 32-bit integers.
(Clue C version)
7/3 is 2, remainder is 1
2147483648 + 2147483649 is 1
The sum 1 is greater than 2147483648
(pure GCC version)
7/3 is 2, remainder is 1
2147483648 + 2147483649 is 1
The sum 1 is less or equal to 2147483648
(of program)
#include <stdio.h>
void show_division(int x, int y);
void show_division(int x, int y) {
printf("%d/%d is %d, remainder is %d\n", x, y, x/y, x%y);
}
void show_add(unsigned int x, unsigned int y);
void show_add(unsigned int x, unsigned int y) {
unsigned int z = x + y;
printf("%u + %u is %u\n", x, y, z);
if( z > x ) {
printf("The sum %u is greater than %u\n", z, x);
}
else {
printf("The sum %u is less or equal to %u\n", z, x);
}
}
int main(int argc, char* argv[]) {
show_division(7, 3);
show_add(0x80000000u, 0x80000001u);
return 0;
}
The division rounds in the expected way expected because the intermediate result is cast to integer; the addition overflows only internally in printf.
However, if you expect any particular overflow behaviour of your C integers, chances are you're not following ISO C to the letter. ISO C doesn't even guarantee two's complement representation of integers.
[edit: layout]
[edit again: layout, wishing there was a preview]
Comments
I've just tried a simple case in which a program prints the output of an integer division and the output of an integer addition which overflows in 32-bit integers.
The division rounds in the expected way expected because the intermediate result is cast to integer; the addition overflows only internally in printf.However, if you expect any particular overflow behaviour of your C integers, chances are you're not following ISO C to the letter. ISO C doesn't even guarantee two's complement representation of integers.
[edit: layout] [edit again: layout, wishing there was a preview]