有符号数跟无符号数的区别 ( 积分: 30 )

  • 主题发起人 主题发起人 sjjwan
  • 开始时间 开始时间
S

sjjwan

Unregistered / Unconfirmed
GUEST, unregistred user!
在计算机中,如果8表示无符号数,那它的二进制表示方式是00001000,那如果8是有符号数
,如是-8,则它在计算机中的二进制表示方式是10001000,那CPU是怎么来判断10001000是-8呢
而不是136呢(在无符号的情况下)!
请各位高手指点啊
 
在计算机中,如果8表示无符号数,那它的二进制表示方式是00001000,那如果8是有符号数
,如是-8,则它在计算机中的二进制表示方式是10001000,那CPU是怎么来判断10001000是-8呢
而不是136呢(在无符号的情况下)!
请各位高手指点啊
 
没办法,靠你写代码时的声音吧!
 
这个东西你不用关心啊,系统知道接下来的数是有符号的还是无符号类型的,如果是有符号类型的那么第一位就是他的符号位啊
 
呵呵
读到内存中的一块数据,都是1010101010……
怎么知道这是表示字符还是数字还是其它呢?
程序应该知道读出来的是什么东西,对应该怎么处理吧
 
汇编指令算法不一样
 
找本关于电脑硬件的大学教材学学吧, 特别留意CPU寄存器和运算器的章节, 很清晰的.
 
让我来告诉你吧,其实,仅仅一个字节的数据,谁也看不出来,它是有符号数还是无符号数,
或者,它代表的是数字,还是代表一个字符... 那么如何区分? 主要看你如何定义变量..
1.指令编码不同,假设:无符号数加法的指令码为$06,带符号数的加法指令码为$07,这样,
CPU在取出某个加法指令时,根据指令编码,就知道操作数的类型了....
2.继续举例,你在源代码中定义 j: Integer;
则之后对 j 的操作所生成的CPU指令都是'符号型'的
如果,你定义了, j: DWORD;
则之后对 j 的操作所生成的CPU指令都是'无符号型'的....
3.一般计算机中整数采用的是补码表现形式,那么,无论加/减运算,操作数有/无符号,
都可以用同一套计算方法,则CPU可以不用象"1."那样在加减的时候作区分了....
4.但是在其他地方还是要区分的,象 8086 CPU 就有'无符号乘法'和'有符号乘法'两种
指令, 使用哪种指令, 就当做哪种类型来处理, 在高级语言中, 规则和我上面叙述
的'1.'类似, 主要看你在定义变量时, 用的是哪种类型(Integer/DWORD) ....
5.顺便一提, 象这种 if (j < 0) 如何区别 ? (无符号数肯定不会小于0, 即使最高位为1)
也是根据变量j的定义来使用相对应的CPU指令, 以 Intel 8086 汇编语言举例:
如果 j: DWORD , 则生成的汇编代码可以是:
CMP j, 0 // 比较两个数, 不保存结果, 仅影响PSW寄存器
JNC NEXT // 之前运算没有借位(CF = 0), 不小于, 则跳转
xxxx // 小于0时需要做的动作
NEXT: yyyy
如果 j: Integer , 则生成的汇编代码可以是:
CMP j, 0 // 比较两个数, 不保存结果, 仅影响PSW寄存器
JNL NEXT // 运算结果不小于0(SF xor OF = 0, 或 ZF = 1), 则跳转
xxxx // 小于0时需要做的动作
NEXT: yyyy
罗里罗嗦讲了一大堆,也不知讲清楚了没有,也许有的地方说的不对,仅供参考 ..
 
事实上CPU根本不判别是有符号数还是无符号数,是人为通过指令来体现出来。
 
还有,-8在计算机里也不一定是用10001000的。
 
后退
顶部