char ch = -1; printf("%x\n", ch); 为什么输出8个f呢,不是就一个字节吗?

小水晶 2007-10-25 12:38:33
char ch = -1;
printf("%x\n", ch);

这样输出会是ffffffff,32个字节
可如果printf("%x\n", (unsigned char)ch);就是ff
请问这是怎么回事?
...全文
1725 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzyjsjcom 2007-10-25
  • 打赏
  • 举报
回复
friend up
ccyingfu 2007-10-25
  • 打赏
  • 举报
回复
明白了 %x 是按int型输出的
HW121 2007-10-25
  • 打赏
  • 举报
回复
printf("%x\n", ch); 其中%x 表示无符号十六进制的整数,
多长取决你的编译系统,而非ch的类型,会将ch转成无符号十六进制的整数输出。
如果想按多长整数输出前面再加 h | l | ll | I | I32 | I64 ,
printf("%hx\n", ch); h(short) 表示 16位整数.
raptormk16 2007-10-25
  • 打赏
  • 举报
回复
第二个参数是根据格式化字符来进行转换的,一般为int,有些为double,看MSDN
zhangyanli 2007-10-25
  • 打赏
  • 举报
回复
printf();函数只识别第一个参数,即格式字符串,对于后一个参数,如你不指定,则当作32位的int来处理.
此时进行符号扩展,变成32位,如上所得.
printf("%x\n", (unsigned char)ch);同样是上面的原因.你把他当作signed char定义,可是输出时转化为unsigned
故输出8位.(-1的机内补码表示为全1,即ffffffffH)

建议楼住找点资料好好看看printf,sprintf,他们经常导致这些莫名其妙的错误.
  • 打赏
  • 举报
回复
先扩展为int 那么对应的就是 int类型的 -1;
然后输出
ccyingfu 2007-10-25
  • 打赏
  • 举报
回复
char ch = -1;
printf("%x\n", ch);
//输出ffffffff,是4个字节32位,最高位是1,说明是负数.

printf("%x\n", (unsigned char)ch);
//unsigned char是将ch强制类型转换,char本身是1个字节的,所以输出ff
//无符号ff的十进制是255


ps:初学不知道对不

69,373

社区成员

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

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