--- I wrote:
> If I could do just one modification to the standard, I'd add an overflow
> macro, like errno.
--- peternilsson42 replied:
> The behaviour on integer overflow is undefined. Hence,
> implementations already have the freedom to do precisely
> that if they so choose. [That they don't is indicitative!]
And what the absence of this feature indicates?
Regarding my original problem:
I simplified the problem, compiled to assembly and modified the assembly to
get my desired result. It would be very simple to implement the right math,
that is, to consider the result of the multiplication of two integers as a long
long int, as shown below:
[EMAIL PROTECTED] ~/programming/c/problem/simple
$ cat problem.c
#include <limits.h>
#include <stdio.h>
int main (void) {
int a = USHRT_MAX;
long long int b;
b = (a*a);
printf ("%d * %d = %lld ?\n", a, a, b);
return 0;
}
[EMAIL PROTECTED] ~/programming/c/problem/simple
$ cat Makefile
all : problem.exe
problem.s : problem.c
gcc -Wall -Wconversion -O0 problem.c -S
problem.exe : problem.s
gcc -Wall problem.s -o problem.exe
[EMAIL PROTECTED] ~/programming/c/problem/simple
$ cat problem.s
.file "problem.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "%d * %d = %lld ?\12\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $56, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -20(%ebp)
movl -20(%ebp), %eax
call __alloca
call ___main
movl $65535, -4(%ebp)
movl -4(%ebp), %eax
imull -4(%ebp), %eax
cltd
movl %eax, -16(%ebp)
movl %edx, -12(%ebp)
movl -16(%ebp), %eax
movl -12(%ebp), %edx
movl %eax, 12(%esp)
movl %edx, 16(%esp)
movl -4(%ebp), %eax
movl %eax, 8(%esp)
movl -4(%ebp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
.def _printf; .scl 3; .type 32; .endef
[EMAIL PROTECTED] ~/programming/c/problem/simple
$ cat pedro.diff
23a24
> movl $0, %edx
26d26
< cltd
[EMAIL PROTECTED] ~/programming/c/problem/simple
$ cat pedro.s
.file "problem.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "%d * %d = %lld ?\12\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $56, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -20(%ebp)
movl -20(%ebp), %eax
call __alloca
call ___main
movl $65535, -4(%ebp)
movl $0, %edx
movl -4(%ebp), %eax
imull -4(%ebp), %eax
movl %eax, -16(%ebp)
movl %edx, -12(%ebp)
movl -16(%ebp), %eax
movl -12(%ebp), %edx
movl %eax, 12(%esp)
movl %edx, 16(%esp)
movl -4(%ebp), %eax
movl %eax, 8(%esp)
movl -4(%ebp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
movl $0, %eax
leave
ret
.def _printf; .scl 3; .type 32; .endef
[EMAIL PROTECTED] ~/programming/c/problem/simple
$ ./problem.exe
65535 * 65535 = -131071 ?
[EMAIL PROTECTED] ~/programming/c/problem/simple
$ ./pedro.exe
65535 * 65535 = 4294836225 ?