原码和补码问题

bkuai 2008-10-26 05:14:33
char c = 255;
printf("c = %d\n", c);
想问c在内存中是如何存储的
原码应该为1111 1111
补码为1000 0001
可是用
for(i=7;i>=0;i--)
printf("%d",(c>>i)&0x1);
写出来看是1111 1111,这个应该是在内存中的补码吧
那么c的原码是1000 0001么 怎么得出的??
...全文
290 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dxxxl 2008-10-31
  • 打赏
  • 举报
回复
补码这个概念是针对有符号数,而无符号数另当别论
killbug2004 2008-10-31
  • 打赏
  • 举报
回复
别人写的,我感觉很好很强大
补码的原理及随想
越早在课堂上学的东西,越给我以简单的印象,忘得也越快。而事实上,它们往往是最富有智慧的,即便在我没忘的时候,也没有深刻地理解它们。

嘛是补码?不少书上扯一堆“取反加1”之类的规则,很不着重点,我觉得核心在于:

对于范围为[0,M)的整数计量系统,其模为M。和为M的两个数互为补数。

如果有两个整数a,b∈[0, M),那么f(a-b)==f(a+c),其中c= M-b,是b的补码,
f是一个映射,定义为:
当0<=x< M时,f(x)=x;
当x>= M时,f(x)=x % M;-------->此时就要消除溢出
当x<0时,f(x)=f(M +x).
其中%为取余运算(效果同编程语言中的取模运算)。

在计算机中,f是由溢出隐式实现的,所以天生就有a-b==a+c。这就把减运算转化成了加运算。

于是,为了便于执行减运算,计算机就把-b表示为其补码c。

假设机器字有n位,那么M=2n,c=2n-b。

人在纸上怎么计算2n-b的二进制值?2n的原码就是1后面跟了n个0,直接用它减b的原码不方便,先用2n-1的原码(n个1)减b的原码,得到的结果加上1就是2n-b的值了——这就是“取反加1”的由来。
heyangbin 2008-10-31
  • 打赏
  • 举报
回复
学习
likefermat 2008-10-28
  • 打赏
  • 举报
回复
正数的补码等于本身,负数的补码等于取反+1
cnzdgs 2008-10-27
  • 打赏
  • 举报
回复
电脑中都是用补码的。
bysdy 2008-10-26
  • 打赏
  • 举报
回复
char c的范围是-128~127
255超出了表示的范围了
如果把
char c=255;
printf("%d ",c);用汇编看就是

0040102F |. C645 F8 FF mov byte ptr [ebp-8], 0FF ;这里的0FF就是255
00401033 |. 0FBE45 F8 movsx eax, byte ptr [ebp-8]
00401037 |. 50 push eax ; /<%d>
00401038 |. 68 20204200 push 00422020 ; |format = "%d "
0040103D |. E8 6E000000 call printf ; \printf
bkuai 2008-10-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bysdy 的回复:]
char c = 255;
255的原码是00000000 11111111

[/Quote]

c只有一个字节呀 为什么是原码是00000000 11111111 2个字节??
bysdy 2008-10-26
  • 打赏
  • 举报
回复
char c = 255;
255的原码是00000000 11111111
正数的补码是它本身
因为255>127溢出了,计算机直接把最后的11111111存入内存
所以就变成-1了

如果存入的是-128~127之间的数,比如-4,那么它在计算机里存储就是
11111100,是-4的补码~~

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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