https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66213

            Bug ID: 66213
           Summary: unsigned char value range can be greater than sizeof
                    unsigned char
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: z.hege...@t-systems.com
  Target Milestone: ---

Unsigned char can be greater than 1 byte (== sizeof(unsigned char))
Example:
#include <stdio.h>
int main() {
    unsigned char a=200, b=80;
    int z = a+b;
    printf("z=: %d\n", z);

        return 0;
}

When data type char or signed char is used in the example above a char overflow
occurs (as expected) but if unsigned char is used the return value can be
greater than 1 byte (or sizeof(unsigned char))

Reason:
Breakpoint 8, 0x004011f6 in main () at char.c:8
(gdb) i r
eax            0x50     80
edx            0xc8     200

Breakpoint 10, 0x00401215 in main () at char.c:10
0x0040121a      10              z = c+d;
(gdb) ni
(gdb) i r
eax            0x50     80
edx            0xffffffc8       -56

Where "c" and "d" are signed chars.

When unsigned char is used gcc uses movzx instead of movsx and probably the
sign bit is overwritten.

Reply via email to