, gcc4.7, gcc , .
gcc , '0' + 0, .
clang , arg n, , , gcc. gcc clang , asm arg, n.
, , ! .
- , 9 , 0. ( . ,
static , '0'. 0 (not '0') , , , clang gcc ) - ,
buf+1 , buf[i++] for() . - undefined,
i++ i , . - , ,
CHAR_BIT 8. (- static char buf[CHAR_BIT*sizeof(n)/4 + 1], ).
clang gcc - , <<, , . i th , : buf[i]='0'+ (0x0f & (n >> (4*i)));
, . gcc, , @Fabio tmp >>= 4 . , shr reg, imm8 . (clang gcc, , n>>(4*i) 4.)
gcc . , , A F.
, , , , 48 == 0x30 == '0'. ( , 9- , clang).
bugfixed godbolt .
Fabio . , gcc , Fabio , . ( , n>>(4*i) n>>=4.)
gcc6.3 . , !
i2s_orig:
mov BYTE PTR buf.1406+3, 48
mov BYTE PTR buf.1406, 48
cmp BYTE PTR buf.1406+3, 48
mov BYTE PTR buf.1406+1, 48
mov BYTE PTR buf.1406+2, 48
mov BYTE PTR buf.1406+4, 48
mov BYTE PTR buf.1406+5, 48
mov BYTE PTR buf.1406+6, 48
mov BYTE PTR buf.1406+7, 48
mov BYTE PTR buf.1406+8, 48
mov BYTE PTR buf.1406+9, 0
jne .L7 # testing flags from the compare earlier
jne .L8
jne .L9
jne .L10
jne .L11
sete al
movzx eax, al
add eax, 8
.L3:
add eax, OFFSET FLAT:buf.1406
ret
.L7:
mov eax, 3
jmp .L3
... more of the same, setting eax to 4, or 5, etc.
jne .