强制类型转换中出现的问题
实现一个将int类型的变量按十六进制,以字节为单位输出
这里写代码片
#include<stdio.h>
typedef char *byte_pointer;
void showByte(byte_pointer start, size_t len){
size_t i=len;
for(i=0;i<len;i++){
printf("%.2x\n",start[i]);
}
}
int main(){
int a=12345;
showByte((byte_pointer)(&a),sizeof(a));
return 0;
}
运行结果为:
39
30
00
00
但是当a为负数时,例如为-122时,运行结果为:
ffffff86
ffffffff
ffffffff
ffffffff
希望的运行结果是:
86
ff
ff
ff
问题出在printf(“%.2x”,start[i]),输出时%x会让char类型自动与int类型对齐,将8位扩展为32为,对于无符号(unsigned char)类型,扩展时在左边加“0”,而对于有符号(char)类型,扩展是在左边加“1”,所以才会出现ffffff86状况,解决方法就是将:
typedef char *byte_pointer;
修改为:
typedef unsigned char *byte_pointer;
修改后代码为:
#include<stdio.h>
typedef unsigned char *byte_pointer;
void showByte(byte_pointer start, size_t len){
size_t i=len;
for(i=0;i<len;i++){
printf("%.2x\n",start[i]);
}
}
int main(){
int a=-122;
showByte((byte_pointer)(&a),sizeof(a));
return 0;
}