printf(),unsigned char和%hhd

Dev*_*lar 0 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 );
}
Run Code Online (Sandbox Code Playgroud)

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

127
-128
127
Run Code Online (Sandbox Code Playgroud)

这是预期的.现在,我在Raspberry Pi(ARM)上运行了相同的操作:

1
255
0
-1
Run Code Online (Sandbox Code Playgroud)

所以... 显然我误解了一些步骤CHAR_MAX正在采取输出的方式,因为在最后一行预期的输出 - 传递CHAR_MAX%hhd一个char没有签名的机器- 本来就是255.

(如果你应该问,结果是相同的(char)CHAR_MAX,和(unsigned char)CHAR_MAX.)

我错过了什么?

在回归测试我自己printf()在Raspberry Pi上的实现时发生了这种情况- 顺便说一句,它会打印出来255.所以...只有一个实施正确,我有下沉的感觉,这不是我的......

Som*_*ude 5

格式"%hhd"用于签名字节.如果传递无符号字节,则技术上会有未定义的行为.要打印您需要使用的无符号字节"%hhu".

真正发生的是因为两个补码整数是如何工作的,这0xff等于-1.

  • 嗯......第二个想法......如果将无符号值传递给'%hhd`是UB,那么我的实现会给出不同的结果真的很重要吗?(在这里跟自己说话,随便不回答.;-)) (2认同)