unsigned和signed转换问题

karon1988 2011-03-14 10:33:44
写了段小code测试,代码如下:

1 #include <stdio.h>
2 int main()
3 {
4 char B=172,C;
5 unsigned char uB=172,uC;
6 C=~B;
7 uC=~uB;
8 printf("signed: %d %d\n",B,C);
9 printf("unsigned:%d %d\n",uB,uC);
10 return 0;
11 }
-------------------------------------------------
运行结果:
signed: -84 83
unsigned:172 83
-------------------------------------------------
为啥都是172,转成int就变了??
我取反后,发现在内存中B和uB应该是一样的啊。
敢问各位大侠这种牵涉到unsigned到signed的转换到底是怎样进行的?
...全文
546 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
karon1988 2011-03-15
  • 打赏
  • 举报
回复
多谢各位。结贴吧。^_^
zy020118 2011-03-15
  • 打赏
  • 举报
回复
liyaobinRyan 2011-03-15
  • 打赏
  • 举报
回复
unsigned没有负数
辰岡墨竹 2011-03-14
  • 打赏
  • 举报
回复
signed和unsigned转换为int会扩展符号,这就是为什么字符处理时还是以unsigned char为好的原因,因为扩展ASCII码和GBK等都是128以上的。
还有#5楼,你对人家要求太高了,人家初学C的,很可能不懂汇编,汇编是更高年级的课程。
lrgy_zhch 2011-03-14
  • 打赏
  • 举报
回复
此问题涉及到char到int的转化。

char分为signed char和unsigned char。

signed char简化为char。

printf("signed: %d %d\n",B,C);//此句属于signed char到int的转化。如果最高位为1,那么高位补1。反之,高位补0。结果当然是-84 83

printf("unsigned:%d %d\n",uB,uC);//此句属于unsigned char到int的转化。高位补0。结果当然是172 83
赵4老师 2011-03-14
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编。)
yuyan_linger 2011-03-14
  • 打赏
  • 举报
回复
类型提升的时候 如果是signed 首位为1的话 补充1 首位为0的话 补充0
如果是unsigned 都补充0
karon1988 2011-03-14
  • 打赏
  • 举报
回复
更清楚点说吧。。
我的一个疑惑是:
B和uB在内存中是一模一样的。
那为什么分别把B和uB转换为int后就不一样了??
这个转换过程具体是怎么进行的?
karon1988 2011-03-14
  • 打赏
  • 举报
回复
但是int是4B,而char是1B。
B和uB在内存中是 0xac (172)
那转换为int应该是0x 00 00 00 ac
高位怎么都应该是0啊。。。
咋会出现负数??
yuyan_linger 2011-03-14
  • 打赏
  • 举报
回复
为啥都是172,转成int就变了??
char B=172 signed最大也就127了 所以当然溢出变成负数了

我取反后,发现在内存中B和uB应该是一样的啊。
内存中本来就是一样的 只不过解释的不同

敢问各位大侠这种牵涉到unsigned到signed的转换到底是怎样进行的?
在存储范围之内两者的值是一样的,溢出之后 signed的值如果第一位是1就是负数了,至于负多少,二进制的负数应该会计算的吧
lrgy_zhch 2011-03-14
  • 打赏
  • 举报
回复
1.无论int是unsigned还是signed,如果int转化为char,均截取最低8位作为char的值。
2.例如
(1)如果char为signed
char c;
int i=193;
c=i;
printf("%d\n",c);//输出-63,因为-63为193的补
printf("%c\n",c);//输出?,因为char最高位为1,所以输出问号

(2)如果char为unsigned
unsigned char c;
int i=193;
c=i;
printf("%d\n",c);//输出193
printf("%c\n",c);//输出?,因为char最高位为1,所以输出问号
karon1988 2011-03-14
  • 打赏
  • 举报
回复
char转int基本弄懂了。。

那int转char呢?
是不是直接截取后8bit,而不用考虑是否有符号???
karon1988 2011-03-14
  • 打赏
  • 举报
回复
ubuntu下。。。gdb不会用。。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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