http://bbs.csdn.net/topics/390184854
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <stdio.h>int main(){ unsigned char k = 0; int i = -1; short a = -12345; char *p; printf ( "sizeof(i) = %d\n" , sizeof (i)); printf ( "sizeof(a) = %d\n" , sizeof (a)); p = ( char *)&a; for (k=0;k< sizeof (a);k++) { printf ( "%x " ,*(p++)); } printf ( "\n" ); p = ( char *)&i; for (k=0;k< sizeof (i);k++) { printf ( "%x " ,*(p++)); } printf ( "\n" ); printf ( "i = %u | %d\n" ,i,i); printf ( "a = %u | %d\n" ,a,a); printf ( "res = %d\n" ,(-1>0u ? 1:0)); printf ( "hello world\n" ); return 0;} |
上述代码经编译执行后的结果为:
sizeof(i) = 4
sizeof(a) = 2
ffffffc7 ffffffcf
ffffffff ffffffff ffffffff ffffffff
i = 4294967295 | -1
a = 4294954951 | -12345
res = 1
hello world
请问为什么char类型的指针p输出的都是32位的内容呢?
将指针p的声明更改为unsigned char* p;程序输出结果如下:
sizeof(i) = 4
sizeof(a) = 2
c7 cf
ff ff ff ff
i = 4294967295 | -1
a = 4294954951 | -12345
res = 1
hello world
请问unsigned char* 与char*在这个程序中为什么能产生这种不同的结果?
char*是有符号的, 如果大于127即0x7F的数就是负数了,使用%x格式化输出,就会产生变化.
所以使用%x格式化输出数据时,记得一定要转换成无符号类型.
printf("%02x ",(unsigned char)*(p++));
有符号的字符型数据C7,CF分别传入printf,此时会将类型提升为int,由于是有符号数,所以符号位要进行扩展,得到FFFFFFCF和FFFFFFC7。
无符号的字符型数据C7,CF分别传入printf,此时会将类型提升为unsigned int,由于无符号数不进行符号位扩展,所以得到000000CF和00000C7。
p指针指向的内容确定是一个字节,无论把它解读成有符号或是无符号数,都是一个字节长度,但为什么printf会针对无符号和有符号进行符号位扩展呢,即类型提升?
难道printf默认打印16进制格式内容时,会依据平台相关的机器字长来打印吗
因为你用了%x所以提升
你用printf时不是指定了输出的格式了吗,就按你指定的格式进行转换,具体字长由编译器决定
正解!(^_^)