一个小小的疑问,求解答

Amazing_Donkey 2013-07-17 06:46:55
这样一个简易测试程序,在VC6下运行:

#include <stdio.h>
int main(void)
{
char szTmp[5] = "\x9F\x36";
printf("%x %x\n",szTmp[0],szTmp[1]);
return 0;
}

得到下边这个运行结果,只是想问,为什么前边会显示6个 f 呢?
...全文
81 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Amazing_Donkey 2013-07-17
  • 打赏
  • 举报
回复
引用 2 楼 Automation_dmu 的回复:
那就给他屏蔽掉
printf("%x %x\n",szTmp[0]&0xff,szTmp[1]&0xff);
我试了下,确实ok了,不过为什么呢?
Amazing_Donkey 2013-07-17
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
#include <stdio.h>
int main(void)
{
   char szTmp[5] = "\x9F\x36";
   printf("%x %x\n",szTmp[0],szTmp[1]);
   printf("%x %x\n",(unsigned char)szTmp[0],szTmp[1]);
   return 0;
}
//ffffff9f 36
//9f 36
说明对于你的编译器: char其实是signed char
原来做了unsigned char 的类型转换,就不会这样显示了,谢谢,最关键的,它是负数!这个居然没去想~
Amazing_Donkey 2013-07-17
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
符号扩充呗. 0x9F 是一个负数, -97, int 里面对应 -97 的数的十六进制就是 ffffff9f
谢谢你,我终于搞清楚了,ffffff9f一共是8个,即32位,这是我们微型计算机的字长,0x9f是负数,所以会这样显示出来。这刚好让我复习了下数值转换的知识,9F=“1001 1111”,各位取反后等于“0110 0000”再加1,等于:“0110 0001”,即0x61 = 97。所以他本身的值是-97。
mujiok2003 2013-07-17
  • 打赏
  • 举报
回复
#include <stdio.h>
int main(void)
{
   char szTmp[5] = "\x9F\x36";
   printf("%x %x\n",szTmp[0],szTmp[1]);
   printf("%x %x\n",(unsigned char)szTmp[0],szTmp[1]);
   return 0;
}
//ffffff9f 36
//9f 36
说明对于你的编译器: char其实是signed char
AndyStevens 2013-07-17
  • 打赏
  • 举报
回复
那就给他屏蔽掉
printf("%x %x\n",szTmp[0]&0xff,szTmp[1]&0xff);
www_adintr_com 2013-07-17
  • 打赏
  • 举报
回复
符号扩充呗. 0x9F 是一个负数, -97, int 里面对应 -97 的数的十六进制就是 ffffff9f

69,369

社区成员

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

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