[Python-Dev] Octal literals (original) (raw)

Bengt Richter bokr at oz.net
Wed Feb 1 16:35:55 CET 2006


On Wed, 01 Feb 2006 12:33:36 +0000, "Gustavo J. A. M. Carneiro" <gjc at inescporto.pt> wrote: [...]

Hmm.. I'm beginning to think 13r16 or 16r13 look too cryptic to the casual observer; perhaps a suffix letter is more readable, since we don't need arbitrary radix support anyway.

/me thinks of some examples: 644o # I think the small 'o' cannot be easily confused with 0 or O, but.. 10h # hex.. hm.. but we already have 0x10 101b # binary Another possility is to extend the 0x syntax to non-hex, 0xff # hex 0o644 # octal 0b1101 # binary I'm unsure which one I like better. Sorry if I seem to be picking nits, but IMO there's more than a nit here:

The trouble with all of these is that they are all literals for integers, but integers are signed, and there is no way to represent the sign bit (wherever it is for a particular platform) along with the others, without triggering a promotion to positive long.

So you get stuff like

def i32(i): return int(-(i&0x80000000))+int(i&0x7fffffff) ... MYCONST = i32(0x87654321) MYCONST -2023406815 type(MYCONST) <type 'int'> hex(MYCONST) '-0x789abcdf' Oops ;-/ hex(MYCONST&0xffffffff) '0x87654321L'

instead of

MYCONST = 16cf87654321

Hm... maybe an explicit ordinary sign after the prefix would be more mnemonic instead of indicating it with the radix-complement (f or 0 for hex). E.g.,

MYCONST = 16r-87654321  # all bits above the 8 are ones

and

MYCONST = 16r+87654321   # explicitly positive, all bits above 8 (none for 32 bits) are zeroes
MYCONST = 16r87654321    # implicitly positive, ditto

or the above in binary

MYCONST = 2r-10000111011001010100001100100001  # leading bits are ones (here all are specified for 32-bit int, but
                                               # effect would be noticeable for smaller numbers or wider ints)
MYCONST = 2r+10000111011001010100001100100001  # leading bits are zeroes (ditto)
MYCONST = 2r10000111011001010100001100100001   # ditto

This could also be done as alternative 0x syntax, e.g. using 0h, 0o, and 0b, but I sure don't like that '0o' ;-)

BTW, for non-power-of-two radices(?), it should be remembered that the '-' is mnemonic for the symbol for (radix-1), and '+' or no sign is mnemonic for a prefixed 0 (which is 0 in any allowable radix) in order to have this notation have general radix expressivity for free ;-)

Regards, Bengt Richter



More information about the Python-Dev mailing list