检查整数基表示

时间:2010-11-18 15:21:44

标签: python

我定义了一个这样的整数:

x = 0xFF

但是当我向译员询问它的价值时,我得到了:

255

有没有办法强制解释器以我定义的方式返回值? 有没有办法检查整数的基本表示?

7 个答案:

答案 0 :(得分:4)

不。我所知道的Python或任何其他语言都没有存储您编写整数文字的基础。0xFF255无法区分。这些都转换为相同的底层表示:binary。

  • 如果您想记住基础,则需要与int不同的类型。也许以字符串形式"0xFF"或整数(0xFF, 16)存储整数。 int根本没有您想要的信息。

  • 更现实地说,您有责任按照自己的方式格式化输出。如果将十六进制数字输入函数并返回结果,那么将结果格式化为十六进制也是你的工作。我不希望这段代码“做你想做的事”:

    print foobar(10)
    print foobar(0xFF)
    

    明确表达你的意图。如果默认格式(十进制)不符合您的喜好,则覆盖它:

    print '%04d' % (foobar(10)))
    print '%04x' % (foobar(0xff)))
    

答案 1 :(得分:2)

0x是十六进制。

强制解释器显示原始值:

hex(x)

>>> x = 0xFFF
>>> x
4095
>>> hex(x)
'0xfff'
>>> 

答案 2 :(得分:1)

0xFF(十六进制)和255(十进制)是相同的数字。 0377(八进制)和11111111(二进制)也是如此。无论你定义它的基础是什么,它都是相同的基础价值,你不再重视你的声明。

答案 3 :(得分:1)

无论如何,该值将以二进制表示。 当您决定将值分配给变量时,Python不记得您编写值的方式 如果要存储此信息,请创建一个特定的类,以便为您存储此信息并正确显示该值。请注意,当您要分配值时,无论如何都必须明确指定基数。

答案 4 :(得分:0)

使用标准整数表示(基数2)表示整数。定义整数时,为其指定一个从表示中隐式转换的值,因此原始基数将丢失。如果您愿意,可以定义自己的类,该类存储此信息以及基础整数值

答案 5 :(得分:0)

上面其他人都说的是真的 - 0xff与255十进制相同。如果您需要能够为其他目的维护字符串表示,可以执行以下操作:

class VerboseInt(object):
   def __init__(self, val):
      '''
         pass in a string containing an integer value -- we'll detect whether
         it's hex (0x), binary (0x), octal (0), or decimal and be able to
         display it that way later...
      '''
      self.base = 10
      if val.startswith('0x'):
         self.base = 16
      elif val.startswith('0b'):
         self.base = 2
      elif val.startswith('0'):
         self.base = 8
      self.value = int(val, self.base)         

   def __str__(self):
      ''' convert our value into a string that's in the same base
      representation that we were initialized with.
      '''
      formats = { 10 : ("", "{0}"), 
            2: ("0b", "{0:b}"), 
            8: ("0", "{0:o}"), 
            16: ("0x", "{0:x}")
            }

      fmt = formats[self.base]
      return fmt[0] + fmt[1].format(self.value)

   def __repr__(self):
      return str(self)

   def __int__(self):
      ''' get our value as an integer'''
      return self.value

答案 6 :(得分:0)

您对此有何看法:

 x = 0x7F + 128
 print x

数字基础不是Python整数的内部表示的一部分。如果需要,您可以维护一个字符串而不是int,并在需要时显式转换为int。