Hey,
On 9/22/07, Ian! D. Allen <idallen [ at ] idallen [ dot ] ca> wrote:
> Perhaps one thing that is missing in this conversation is the fact that
> when the ALU adds one to any memory value, the same thing always happens.
> Basic integer math doesn't care about sign. There is no concept, at the
> ALU level, of "signed" or "unsigned". It's all just bits being added.
...
> For addition (or subtraction) it doesn't matter if the variable is signed
> or unsigned - when you say "x = x + 1" the ALU just adds one to the bits
> in memory and sets some CPU flags. Signed, unsigned, same thing.
Just for fun, I compiled and disassembled the code.
For anyone interested:
intadd.c
----
#include <stdio.h>
#include <stdlib.h>
int s_add() {
signed int sx = 2000000000;
signed int sy = 2000000001;
signed int sz = sx + sy;
// printf("sz is 0x%x which could be %d or %u\n", sz, sz, sz);
}
int us_add() {
unsigned int ux = 2000000000;
unsigned int uy = 2000000001;
unsigned int uz = ux + uy;
// printf("uz is 0x%x which could be %d or %u\n", uz, uz, uz);
}
int main(int c, char *v[]) {
s_add();
us_add();
exit(0);
}
gcc -o intadd intadd.c
objdump -S -D intadd > intadd.asm
Shows:
08048374 <s_add>:
8048374: 55 push %ebp
8048375: 89 e5 mov %esp,%ebp
8048377: 83 ec 10 sub $0x10,%esp
804837a: c7 45 f4 00 94 35 77 movl $0x77359400,0xfffffff4(%ebp)
8048381: c7 45 f8 01 94 35 77 movl $0x77359401,0xfffffff8(%ebp)
8048388: 8b 45 f8 mov 0xfffffff8(%ebp),%eax
804838b: 03 45 f4 add 0xfffffff4(%ebp),%eax
804838e: 89 45 fc mov %eax,0xfffffffc(%ebp)
8048391: c9 leave
8048392: c3 ret
08048393 <us_add>:
8048393: 55 push %ebp
8048394: 89 e5 mov %esp,%ebp
8048396: 83 ec 10 sub $0x10,%esp
8048399: c7 45 f4 00 94 35 77 movl $0x77359400,0xfffffff4(%ebp)
80483a0: c7 45 f8 01 94 35 77 movl $0x77359401,0xfffffff8(%ebp)
80483a7: 8b 45 f8 mov 0xfffffff8(%ebp),%eax
80483aa: 03 45 f4 add 0xfffffff4(%ebp),%eax
80483ad: 89 45 fc mov %eax,0xfffffffc(%ebp)
80483b0: c9 leave
80483b1: c3 ret
So you can see that the assembly is indeed identical in the two functions
and therefore sign independent. I won't try to explain each line of the
UGLY x86 assembly. ;-)
The interested (obsessive?) reader can
add in the signed/unsigned comparison and see what assembly is
generated.
--
// Randy