2016-12-07 56 views
-4

当试图打印'UINT_MAX'时,我得到它-1,这是为什么?这是我在'main()'中打印的唯一一个printf语句,它打印'UINT_MAX'当试图打印UINT_MAX时,我得到-1

+2

请出示你的代码(最好是[MCVE(http://stackoverflow.com/help/mcve))。 –

回答

0

您使用了%d格式代码,该代码将其参数解释为有符号的int。你在一个二进制补码系统中,所以UINT_MAX0xFFFFFFFF),解释为一个有符号的int,等于-1。如果你想打印它被解释为unsigned,请使用%u

+0

它不是“解释为有符号整数”。这只是未定义的行为。您的格式说明符必须与您尝试打印的类型相匹配。 –

+1

@R ..“格式说明符必须与_promoted_类型相匹配,并且如果该值可用两种类型表示,则”int“或”unsigned“使用”%d“或”%u“作为指定的异常。否则它的UB使用错误匹配的说明符/类型。 – chux

+0

@chux:'printf'实际上没有任何这种例外,因为这两种类型的值都可以表示。也许你正在考虑'va_arg'。 –

0

你可以用printf()的

printf("%u\n", UINT_MAX); 

您需要使用u符,man printf打印。

为什么你得到-1与d说明符?这是因为如何在内存中工作一个有符号的整数。

unsigned integer从0开始,在内存中它是一个简单的二进制系统。

十进制=>二进制

  • 1 => 1
  • 2 => 10
  • 8 => 1000
  • 255 => 11111111

符号整数使用位被解释为负数,这是令人困惑的,因为无符号int的最大值在被解释为int时为-1。

例如用8位整数:

  • -1 => 11111111
  • -128 =>千万
  • -9 => 11110111

喜欢你看,所述第一位被用来作为符号位。

尝试用这种site

相关问题