C语言的一个问题

liuwenjun830 2008-09-02 03:47:29

void main()
{
short i = 255;
char *cp;
cp = &i;
printf("%d\n",*cp);
}

我电脑用sizeof(short)得出来的结果是2,sizeof(char)得出来的结果是1
i = 255的二进制为11111111,这样cp得到的就是指向i的低位,就是这个的值,结果应该是-127,可是为什么打印出来的是-1呢?

void main()
{
short i = 512;
char *cp;
cp = &i;
cp++;
printf("%d\n",*cp);
}

这样cp指向变量i的高8位,512的二进制为:1000000000,cp++后指高i的高8位,打印出来的值为2,这个结果是正确的。

void main()
{
short i = 65535;
char *cp;
cp = &i;
cp++;
printf("%d\n",*cp);
}

这样为什么打印出来的又是-1了?
11111111这个表示的不是-127吗?怎么会是-1了?
请高人帮解释下?
...全文
72 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuwenjun830 2008-09-02
  • 打赏
  • 举报
回复
非常感谢大家的回答。
11111111这个就是表示的是-1
负数的转换规则搞错了。
非符号位取反,然后再加1转换成10进制,得到对应的负数。
周详521 2008-09-02
  • 打赏
  • 举报
回复
可惜LZ把二进制负数算法忘记了
liuwenjun830 2008-09-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jone7319 的回复:]
cp指针指向的是I的地址 cp++则指向下一个地址,CP的值与I无关,只是内存中的一个随机地址而已,不知你要干什么,
[/Quote]

cp指向的是i的地址,但是i是short类型的,cp是char类型的指针
cp首先指向的是i的低8位,cp++后,cp移动1字节,指向i的高8位
所以cp不是一个随机的内存地址。
周详521 2008-09-02
  • 打赏
  • 举报
回复
二进制求法:举例-1

第一步:首先要把-1变成00000001的二进制形式
第二步:再者就是安位取反,11111110
第三步:在最后加1 形成: 11111111
queshiybb 2008-09-02
  • 打赏
  • 举报
回复
kankan
xabcxyz 2008-09-02
  • 打赏
  • 举报
回复
以1字节为例,你要知道机器数的表示规律:
符号数数值范围:
(-128   ->   -1   ->  0   -> 127) 对应二进制为:
10000000 -> 11111111 -> 00000000 -> 01111111

也许你觉得很不合理, 但是从0减1后一路借位-1的二进制就是全1
BCBPLC 2008-09-02
  • 打赏
  • 举报
回复
初学者总是为指针发愁
jone7319 2008-09-02
  • 打赏
  • 举报
回复
cp指针指向的是I的地址 cp++则指向下一个地址,CP的值与I无关,只是内存中的一个随机地址而已,不知你要干什么,

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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