补码为什么不能是另外一个正数
答案:2 悬赏:70 手机版
解决时间 2021-05-13 20:49
- 提问者网友:感性作祟
- 2021-05-13 07:28
被补码搞的头晕,比如十进制的2是二进制0010,那么十进制-2的补码是1101+1=1110,而十进制14的二进制数值也是1110,为什么1110这时候就是-2而不是14呢? 在存储器中是如何区别1110是原码还是补码的呢?
最佳答案
- 五星知识达人网友:长青诗
- 2021-05-13 08:59
有不上人答了,不过都不是很准确,我们都知道,全面的补码学习是在计算机组成原理里,其他的书有些也有补码,不过那是为了教学的方便,也就是说,补码是硬件概念,而不是软件概念,我们的软件设计可以不涉及补码的。存储器只是存储数据,不区分数据类型的,数据类型是cpu来区分的。在设计cpu的指令时就有数据类型了,这些数据类型与我们看到的c语言的数据类型大部分是一样的,所以拿c语言的数据类型来说明cpu的数据类型不过分,但要注意,不是所有语言的数据类型与cpu的都类似的。 在cpu的数据类型中,是区分有符号数和无符号数的,在c语言就是signed和unsigned标识,为什么要区分符号数和与符号数呢,主要是由于计算机系统为了表示负数要占去最高位,这会降低数的表示范围,如果我们用无符号数,只用来表示正数,无需符号位,最高位也用来表示数值,这样就是把数的表示范围扩到最大。但是如果我们要表示负数,那就要用到符号数了,c语言里用signed标识,这是计算机就用补码来表示了,最高一位被用来表示符号位。 总上所述,当程序只用正数时,程序可以定义无符号数,正数的原码和补码是一样的,无需区分,最高位用做数值,这时1110就是14。如果程序要表示负数,可以定义符号数,这是就是用补码了,只要最高位是1,就是负的,这时1110就是-2了。 “机灵一动”其实说得很对,只不过没有把概念引到cpu的数据类型里来,要知道c语言的符号数和无符号数的概念不是自创的,而是从cpu里的来的。
全部回答
- 1楼网友:等灯
- 2021-05-13 09:41
对于内存来说只有0,1组合,没有什么正数负数源码补码之分,数值的正负以及源码补码是人为地规定的,针对CPU的机器指令来说,为了简化减法电路的结构,才用补码来表示负数。
对于高级语言来说,数据类型才会有正负数之分,比如C语言,带unsigned引导的类型就不存在负数啊补码啊这种概念,所以(char)-1和(unsigned char)255在内存里是一样的,都是16进制FF,“补码为什么不能是另外一个正数”这种说法容易引起误解。
到此为止,“在存储器中是如何区别
呵呵,我也是被这些问题难倒。不知道原理不爽的!
首先内存会根据你的数据类型划分范围。如:整型16位,字符型8位。再看最高位是0还是1。(不然照你那种说法的那还有尽头啊)
在存储器中是如何区别有正负的(signed)4位二进制表示的只能是-8 到 7, 十进制的14要用更高位数来表示。。。 如果是 unsigned的话,
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯