Printf()打印字符为32位

cal*_*000 5 c printf

我正在运行一个快速测试,以确保我的指针算术运算:

main.c中

#include <stdio.h>
#include <stdlib.h>

#define ADDRESS    0xC0DCA11501LL
#define LENGTH     5


void print_address( char *, char );

/* Main program */
int main( int argc, char *argv[] )
{
    char nums[ LENGTH ];

    /* LSB first */
    for( int i = 0; i < LENGTH; i++ )
    {
        nums[ i ] = ( ADDRESS >> ( 8 * i ) ) & 0xFF;
    }

    print_address( nums, LENGTH );

    system("PAUSE");

    return 0;
}

void print_address( char *data, char len )
{
     char *data_ptr = data;

     while( len-- )
     {
            printf( "%X\n", *data_ptr++ );
     }
}
Run Code Online (Sandbox Code Playgroud)

我期望的是以ADDRESS十六进制格式首先打印出LSB 的字节.但最后3个字节似乎以32位长度打印:

1
15
FFFFFFA1
FFFFFFDC
FFFFFFC0
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

这是由于我的位移算术,特定于编译器,某些printf()行为?

(我在Windows 10上使用MinGW GCC v6.3.0进行编译.)

Mic*_*gan 5

我相信你char是一个被用作签名值的人,并且你看到FFFFs因为0xA1大于0x80并因此显示签名.尝试使用unsigned char指针(对于nums数组和data函数原型),问题应该消失.