我正在进行一个快速测试,以确保我对指针算术有所了解:
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++ );
}
}
我的期望是以十六进制格式输出ADDRESS
的字节,最低有效位(LSB)先输出。但是最后三个字节似乎以32位长度打印出来:
1
15
FFFFFFA1
FFFFFFDC
FFFFFFC0
Press any key to continue . . .
这是因为我的位移算术、某些编译器特定的问题还是printf()
的行为导致的吗?
(我使用的是MinGW GCC v6.3.0在Windows 10上进行编译。)
0xC0DCA11501LL
应该改为0xC0DCA11501ULL
。对有符号整数进行移位操作是未定义的行为。 - Jean-François Fabrenums
数组中使用无符号字符。 - Michael Dorgan