--- 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 ?