C语言中unsigned char* 与char*的区别?

hisstone 2012-08-22 04:35:14

#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*在这个程序中为什么能产生这种不同的结果?
...全文
3126 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
franzhong 2012-08-23
  • 打赏
  • 举报
回复
你用printf时不是指定了输出的格式了吗,就按你指定的格式进行转换,具体字长由编译器决定
AnYidan 2012-08-23
  • 打赏
  • 举报
回复
c compiler 假设字符的下一个位置存储的仍是字符,直到遇到 '\0' 结束
Lee_Sheen 2012-08-23
  • 打赏
  • 举报
回复
因为你用了%x所以提升
hisstone 2012-08-23
  • 打赏
  • 举报
回复
谢谢,楼上几位的回复,但还是不太明白!
p指针指向的内容确定是一个字节,无论把它解读成有符号或是无符号数,都是一个字节长度,但为什么printf会针对无符号和有符号进行符号位扩展呢,即类型提升?
难道printf默认打印16进制格式内容时,会依据平台相关的机器字长来打印吗
赵4老师 2012-08-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
printf("%02x ",(unsigned char)*(p++));
[/Quote]
正解!(^_^)
Lee_Sheen 2012-08-22
  • 打赏
  • 举报
回复
有符号的字符型数据C7,CF分别传入printf,此时会将类型提升为int,由于是有符号数,所以符号位要进行扩展,得到FFFFFFCF和FFFFFFC7。

无符号的字符型数据C7,CF分别传入printf,此时会将类型提升为unsigned int,由于无符号数不进行符号位扩展,所以得到000000CF和00000C7。

下同。
ouyh12345 2012-08-22
  • 打赏
  • 举报
回复
char *是字符串,以0为结束符
unsigned char *是普通的指针
赵4老师 2012-08-22
  • 打赏
  • 举报
回复
printf("%02x ",(unsigned char)*(p++));

xiaohuh421 2012-08-22
  • 打赏
  • 举报
回复
char*是有符号的, 如果大于127即0x7F的数就是负数了,使用%x格式化输出,就会产生变化.

所以使用%x格式化输出数据时,记得一定要转换成无符号类型.

70,020

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧