printf(),无符号字符和%hhd

时间:2018-07-02 17:41:55

标签: c printf

程序:

#include <stdio.h>
#include <limits.h>

int main( void )
{
#ifdef __CHAR_UNSIGNED__
    printf( "%d\n", __CHAR_UNSIGNED__ );
#endif
    printf( "%d\n", CHAR_MAX );
    printf( "%d\n", CHAR_MIN );
    printf( "%hhd\n", CHAR_MAX );
}

输出(在我的x86_64桌面上):

127
-128
127

这是预期的。现在,我在Raspberry Pi(ARM)上运行了相同的代码:

1
255
0
-1

所以... 显然我被误解了,某些步骤CHAR_MAX正在输出,就像我在最后一行中期望的那样 -将CHAR_MAX传递到未签名%hhd的机器上的char255将是(char)CHAR_MAX

(如果您要问的话,(unsigned char)CHAR_MAXprintf()的结果相同。)

我想念什么?

这是我在Raspberry Pi上对我自己的255实现进行回归测试期间发生的,顺便说一句,确实打印了 $(function(){ var x = $(".container"); setTimeout(function() { x.addClass("first"); }, 1000); setTimeout(function() { $(x).children().css({transition : "2s"}); $(x).css({transition : "4s"}); x.addClass("second"); }, 2000); setTimeout(function() { $(x).children().css({transition : "0s"}); $(x).css({transition : "0s"}); x.addClass("third"); }, 4000); setTimeout(function() { $(x).children().css({transition : "4s"}); $(x).css({transition : "2s"}); x.addClass("fourth"); }, 6000); setTimeout(function() { $(x).children().css({transition : "2s"}); $(x).css({transition : "3s"}); x.addClass("fifth"); }, 8000); })。所以...只有一种实现是正确的,我下沉的感觉不是我的...

1 个答案:

答案 0 :(得分:5)

格式"%hhd"表示带符号字节。如果传递 unsigned 字节,则从技术上讲,您具有未定义的行为。要打印 unsigned 字节,您需要使用"%hhu"

真正发生的情况是因为two's complement整数是如何工作的,并且0xff等于-1