关于补码溢出的问题。

jverita 2010-05-29 03:27:31
从键盘输入129,发生溢出变成1000 0001,变成了负数,应该对其求补,1111 1111,怎么计算机里存的却是1000 0001呢?
...全文
183 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jverita 2010-05-30
  • 打赏
  • 举报
回复
三楼没说到根上,五楼说的很详细,谢谢大家了。
qq120848369 2010-05-29
  • 打赏
  • 举报
回复
129,这是个正数,机器翻译它为:1000 0001.
你,定义了char ch;
char是有符号变量,机器翻译它的时候会看最高位是0还是1.
当你,ch=129;时, 相当于ch=1000 0001. 就是这么存进去了. ch现在就是个负数了,因为129的最高位是1,这也恰好是char类型的最高位. 好了,系统现在存放的ch=1000 0001. 机器不会再去判断什么了,因为你就把129的二进制拷贝了ch.
现在ch是一个负数,打印的时候,先对1000 0001取反,得到0111 1110, +1得到0111 1111,打印出来的是这个数值加上一个-号.

看一下是不是这样.
#include <stdlib.h>
#include <stdio.h>

int main()
{
printf("129:%X\n",129); //129的二进制表示
char ch=129;
printf("%d\n",ch); //129拷贝给char以后,打印char时机器根据最高位为1,判定ch为负数,所以取反+1并且添加一个负号打印出来,
return 0;
}

129:81
-127

Process returned 0 (0x0) execution time : 0.016 s
Press any key to continue.



向立天 2010-05-29
  • 打赏
  • 举报
回复
你能把问题用代码描述一下么
stein42 2010-05-29
  • 打赏
  • 举报
回复
假设这是一个signed char类型的数(8bit有符号整数)。
取值范围是-128~127。
因为溢出129就变成了-127了,
127转换为二进制数:0111 1111,
按位取反再加1就是1000 0001,这就是-127的二进制表示。
pengzhixi 2010-05-29
  • 打赏
  • 举报
回复
你是用来输入字符的吧。而是是赋值给字符的吧
建鼎呓语 2010-05-29
  • 打赏
  • 举报
回复
头像很抽象,提问比头像还抽象!

69,371

社区成员

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

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