鱼C论坛

 找回密码
 立即注册
查看: 3993|回复: 3

char强制类型转换为int

[复制链接]
发表于 2013-9-4 11:25:14 | 显示全部楼层 |阅读模式
3鱼币
百度百科查char类型是unsigned的
  1 #include <stdio.h>
  2
  3 int main()
  4 {
  5     char a=0xcd;
  6     int b;
  7     b=(int)a;
  8     printf("%x\n",b);
  9     return 0;
10 }

为什么结果是ffffffcd而不是cd(前面是0)
这种情况怎么补位,本人不清楚,本人是按位运算规则补位的
位运算时右移,空位补符号位,既然char是无符号的,为什么不是前面不是补的0而是1
(编译环境:centos 6.4 GCC编译器)

最佳答案

查看完整内容

char 是signed的,不信去搜搜unsigned char,看看有没有这个。 int是4个字节,看看0xcd吧,转换成二进制是11001101,那么十进制就是负数(char是一个字节,最高位为1,十进制就是负数啦)。 既然是负数,那么转成int(4个字节的整数)还是负数,很明显高位补1,(不明白高位补一,想想汇编里的movsx带符号的扩展传送。)结果就是0xffffffcd、 把他转化成十进制和0xcd结果是一样的(注意两个数据的字节不一样,就是最高位不一样 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-4 11:25:15 | 显示全部楼层
char 是signed的,不信去搜搜unsigned char,看看有没有这个。
int是4个字节,看看0xcd吧,转换成二进制是11001101,那么十进制就是负数(char是一个字节,最高位为1,十进制就是负数啦)。
既然是负数,那么转成int(4个字节的整数)还是负数,很明显高位补1,(不明白高位补一,想想汇编里的movsx带符号的扩展传送。)结果就是0xffffffcd、
把他转化成十进制和0xcd结果是一样的(注意两个数据的字节不一样,就是最高位不一样)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-4 12:53:42 | 显示全部楼层
这个程序没有问题,也符合补码规则,你可以把0xcd用计算器转换下就知道了【-51】(用字节表示),
如果用字节表示就是【11001101】,这样解释你能明白吗?
还有你可以这样(printf("%d", b);)就知道结果了!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-9-30 00:01:56 | 显示全部楼层
学习了,定下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 00:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表