新手求解答~--

Jake443403168 2011-08-13 03:21:17
#include<stdio.h>
int main(void)
{

int a = 0x80;
char b =char(a);
printf("%x\n",b);

return 0;
}


各位大神们给一句句分析分析,谢谢了·~
...全文
206 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
才仔 2011-08-14
  • 打赏
  • 举报
回复
二楼的回答很详细了,楼主得自己想一下,不能读依赖他人
jernymy 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zsc_ericluo 的回复:]
#include<stdio.h>
int main(void)
{
int a = 0x80;//int为32位(大部分机器)所以a为00000000 00000000 00000000 10000000(0x80)
char b =(char)a;//强制类型转换,char为8位,提取最低两1000 0000(0x80)
printf("%x\n",b);//十六进制输出的时候是32……
[/Quote]


[Quote=引用 19 楼 tianmo2010 的回复:]
嗯,你要理解清楚

1.数据在计算机内存中都是以补码的形式存储的

2.数据的强制类型转换

LZ慢慢理解
[/Quote]

++
luciferisnotsatan 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaoguangzaia 的回复:]

#include<stdio.h>
int main(void)
{

int a = 0x80;//int为32位(大部分机器)所以a为0x00000080
char b =char(a);//强制类型转换,char为8位,提取最低两位 b = 0x80
printf("%x\n",b);//用十六进制输出字符b的值,输出时输出32位
……
[/Quote]
++
5t4rk 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 fiveyes 的回复:]

学习了。我的理解,内存中的同样数据,如果把它用不同的眼光来看,它就是不同的东东,这就是数据类型。

下面程序希望有所帮助,LZ自己也可以作类似的试验。

C/C++ code

#include <stdio.h>
int main(void)
{

int a = 0x80;
char b =char(a);
printf("%x\n",b);
pri……
[/Quote]
+=
fiveyes 2011-08-13
  • 打赏
  • 举报
回复
学习了。我的理解,内存中的同样数据,如果把它用不同的眼光来看,它就是不同的东东,这就是数据类型。

下面程序希望有所帮助,LZ自己也可以作类似的试验。


#include <stdio.h>
int main(void)
{

int a = 0x80;
char b =char(a);
printf("%x\n",b);
printf("%x\n",-128);
printf("%x\n",128);
printf("%x\n",-1);

return 0;
}

/********* 输出结果 **********
ffffff80
ffffff80
80
ffffffff
*****************************/
zsc_ericluo 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 zsc_ericluo 的回复:]
#include<stdio.h>
int main(void)
{
int a = 0x80;//int为32位(大部分机器)所以a为00000000 00000000 00000000 10000000(0x80)
char b =(char)a;//强制类型转换,char为8位,提取最低两1000 0000(0x80)
printf("%x\n",b);//十六进制输出的时候是32……
[/Quote]
补充点,现在有些编译器为了让CHAR型支持ASCII的多个字符定义的为无符号型,但是这个题个人感觉应该是原始的有符号类型,所以涉及到正负数补码的转换。。。。。。
tianmo2010 2011-08-13
  • 打赏
  • 举报
回复
嗯,你要理解清楚

1.数据在计算机内存中都是以补码的形式存储的

2.数据的强制类型转换

LZ慢慢理解
zsc_ericluo 2011-08-13
  • 打赏
  • 举报
回复
#include<stdio.h>
int main(void)
{
int a = 0x80;//int为32位(大部分机器)所以a为00000000 00000000 00000000 10000000(0x80)
char b =(char)a;//强制类型转换,char为8位,提取最低两1000 0000(0x80)
printf("%x\n",b);//十六进制输出的时候是32位,b的-128在位数转换的时候改变了
}
在输出的时候,会从8位转换为32位,按照C的转换规则:
负数的转换是先用原码表示:10000000 00000000 00000000 10000000 负数最高位为1
然后非符号位按位取反为 :11111111 11111111 11111111 01111111
最后非符号位加1变为补码 :11111111 11111111 11111111 10000000
这就是最后十六进制输出0xFFFFFF80
pathuang68 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaoguangzaia 的回复:]

#include<stdio.h>
int main(void)
{

int a = 0x80;//int为32位(大部分机器)所以a为0x00000080
char b =char(a);//强制类型转换,char为8位,提取最低两位 b = 0x80
printf("%x\n",b);//用十六进制输出字符b的值,输出时输出32位
……
[/Quote]

++
xiaoguangzaia 2011-08-13
  • 打赏
  • 举报
回复
这个%x就是按它的32位补码存储模式输出

-128的补码就是0xffff ff80
不会输出源码0x1000 0080

至善者善之敌 2011-08-13
  • 打赏
  • 举报
回复
上边写错了

应该是

好比0x00000080 以负数形式展现出来就正好是ffffff80
substantiv 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jake443403168 的回复:]

引用 9 楼 babilife 的回复:
引用 7 楼 xiaoguangzaia 的回复:
#include<stdio.h>
int main(void)
{

int a = 0x80;//int为32位(大部分机器)所以a为0x00000080
char b =char(a);//强制类型转换,char为8位,提取最低两位 b = 0x80
printf("%x\n",b……
[/Quote]

本来b在输出的时候就是先转化成整型即128然后高位补齐输出的
至善者善之敌 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jake443403168 的回复:]
引用 9 楼 babilife 的回复:
引用 7 楼 xiaoguangzaia 的回复:
#include<stdio.h>
int main(void)
{

int a = 0x80;//int为32位(大部分机器)所以a为0x00000080
char b =char(a);//强制类型转换,char为8位,提取最低两位 b = 0x80
printf("%x\n",b)……
[/Quote]

因为%x表示16进制整形输出,一个整形在32位机占4个字节,所以输出的时候相当于把-128又强制转换为int类型了,转换的时候被强制反码+1了,好比0x0000007f 以负数形式展现出来就正好是ffffff80
Jake443403168 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wisenowa 的回复:]
哥们,你强制转化那句写错了
[/Quote]
嗯,sorry
code=C/C++]char b =(char)a;[[/code]
这样把。呵呵。不好意思
Jake443403168 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 babilife 的回复:]
引用 7 楼 xiaoguangzaia 的回复:
#include<stdio.h>
int main(void)
{

int a = 0x80;//int为32位(大部分机器)所以a为0x00000080
char b =char(a);//强制类型转换,char为8位,提取最低两位 b = 0x80
printf("%x\n",b);//用十六进制输出字符b的值,输出时输出3……
[/Quote]

嗯,是负数了,负数在内存中也是补码形式存在把,。输出的时候还原为原码再转换到十六进制输出,为什么输出的是这个东东ffffff80?、
wisenowa 2011-08-13
  • 打赏
  • 举报
回复
哥们,你强制转化那句写错了
至善者善之敌 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaoguangzaia 的回复:]
#include<stdio.h>
int main(void)
{

int a = 0x80;//int为32位(大部分机器)所以a为0x00000080
char b =char(a);//强制类型转换,char为8位,提取最低两位 b = 0x80
printf("%x\n",b);//用十六进制输出字符b的值,输出时输出32位
……
[/Quote]

基本是这个意思了,char b =char(a);//强制类型转换的时候因为char的范围是-128~127,所以0X80=128的话已经算是负数了
Jake443403168 2011-08-13
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaoguangzaia 的回复:]
#include<stdio.h>
int main(void)
{

int a = 0x80;//int为32位(大部分机器)所以a为0x00000080
char b =char(a);//强制类型转换,char为8位,提取最低两位 b = 0x80
printf("%x\n",b);//用十六进制输出字符b的值,输出时输出32位
//b本来只有8位,因为b为c……
[/Quote]

内存中的数据不是以补码存储的么。负数输出的时候还原为原码再按十六进制显示怎么会是这样的。。
还是不是很理解
xiaoguangzaia 2011-08-13
  • 打赏
  • 举报
回复
#include<stdio.h>
int main(void)
{

int a = 0x80;//int为32位(大部分机器)所以a为0x00000080
char b =char(a);//强制类型转换,char为8位,提取最低两位 b = 0x80
printf("%x\n",b);//用十六进制输出字符b的值,输出时输出32位
//b本来只有8位,因为b为char是有符号,不足的位数按最高位补充为'1'
//输出ffffff80
return 0;
}
didijiji 2011-08-13
  • 打赏
  • 举报
回复

#include<stdio.h>
int main(void)
{

int a = 0x80;//十六进制 相当于 int a = 128;
char b =char(a);//强制类型转换出错,应该是char b =(char)(a);
printf("%x\n",b);//用十六进制输出字符b的ascii值

return 0;
}
加载更多回复(5)

69,369

社区成员

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

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