The S/360 architecture uses two's complement arithmetic, and that remains the case through z. Accordingly, signed and unsigned arithmetic are the same except for the condition code, except when sign extension is an issue, e.g., adding a word to a grande register..
-- Shmuel (Seymour J.) Metz http://mason.gmu.edu/~smetz3 ________________________________________ From: IBM Mainframe Assembler List [[email protected]] on behalf of Ian Worthington [[email protected]] Sent: Thursday, April 14, 2022 9:04 AM To: [email protected] Subject: Signed/unsigned operations I noticed today that GCC generates for: static __uint32_t sumu32; // unsigned int static __uint64_t sumu64; // unsigned long void addStuff(__uint64_t a64, __uint64_t b64, __uint32_t a32, __uint32_t b32 ) { sumu32 = a32 + b32; sumu64 = a64 + b64; } the following: 117: **** sumu32 = a32 + b32; 77 .loc 1 117 0 78 0044 5810B1C4 l %r1,452(%r11) # sumu32.6, a32 79 0048 5A10B1C0 a %r1,448(%r11) # sumu32.6, b32 80 004c C41F0000 strl %r1,sumu32 # sumu32.6, sumu32 80 0000 118: **** sumu64 = a64 + b64; 81 .loc 1 118 0 82 0052 E310B1D0 lg %r1,464(%r11) # sumu64.7, a64 82 0004 83 0058 E310B1C8 ag %r1,456(%r11) # sumu64.7, b64 83 0008 84 005e C41B0000 stgrl %r1,sumu64 # sumu64.7, sumu64 Have I grossly misunderstood something there? Can I really operate on an unsigned integer with signed operations and get the correct results? Best wishes / Mejores deseos / Meilleurs vœux Ian ...
