我定义了一个这样的整数:
x = 0xFF
但是当我向译员询问它的价值时,我得到了:
255
有没有办法强制解释器以我定义的方式返回值? 有没有办法检查整数的基本表示?
答案 0 :(得分:4)
不。我所知道的Python或任何其他语言都没有存储您编写整数文字的基础。0xFF
与255
无法区分。这些都转换为相同的底层表示: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。