char* or unsigned char*
《深入理解计算机系统》第二章讲述数据存储时,有一下程序。
#include <stdio.h>
typedef unsigned char *byte_pointer;
void show_byte(byte_pointer start, size_t len)
{
for (size_t i = 0; i < len; i++)
printf("%.2x ", start[i]);
printf("\n");
}
void show_int(int x)
{
show_byte((byte_pointer)&x, sizeof(int));
}
int main()
{
int a = 12345, b = 54321;
show_int(a);
show_int(b);
return 0;
}
对某种类型数据获取存储内容16进制时,通常会采取这种方法。
以上程序打印结果:
1 |
|
将unsigned char*
改为char*
后,程序结果为:
1 |
|
char类型占有8位,除去最高位符号位,最大可以表示到127. d4
的8位字节表示时,第8bit位为1。
printf(“%.2x”, start[i])会将start[i]提升为int类型,出现上述情况,是因为d4
符号位进行了扩展。
可通过一下简单验证:
char c = 0xd4;
int i = c;
assert(i == 0xffffffd4);