负数在二进制下的表示可能代表着另一个正整数
而且1bit而且位数有上限怎么处理
这个问题其实还蛮有意思的。但是很简单。
当它表示无符号数时是248,当它表示表示有符号数时是-8。至于它什么时候表示有符号数,什么时候表示无符号数,取决于你写的代码把它当成什么来用。就像两个短细长的木棒,你把它当筷子来用,它就是筷子,你把它当木柴来用,它就燃烧了。在C语言里,当这个数被赋给类似unsigned int类的变量时,它是无符号数(所谓无符号,也就是不需要正负号来表示,没有正负号的数默认是省略了正号,也就是要么是0,要么是负数);当赋给未加unsigned的变量时,它就是有符号数。这也是计算机里变量为什么要有类型的原因之一,本质上大家都是一串二进制数值,靠什么区分呢?靠的就是变量类型啊!对了,你写的代码不管有多长,编译之后也是一串二进制数。可以把它当成数值输出来看看吗?当然是可以的,甚至还能拿来运算,但是没有意义。计算机怎么区分哪些是数值哪些是代码呢?它又没有那么聪明!等你学了计算机组成原理就知道了。
一个数被当成无符号数和有符号数会有什么区别呢?区别仅仅在于,那个数的第一位,计算机应该把它看成数值还是正负号。
以你这个例子中的11111000为例,如果把它当作无符号数,第一位的1是数值,那它的大小就是11111000,转化成十进制就是248。如果把它当作有符号数,第一位就是符号位。不管是源码、反码还是补码,都规定0表示正号,1表示负号。那么1111000就是负数。我们知道补码里负数是正数补码符号位取反,其他位取反加一,11111000的相反数也就是0001000(即+8),所以它是-8。
至于后面的那个问题,你再详细描述一下,没太明白。
如果是正常的(一般都是):111=1+2+2*2那么按这个方法下去你这个转化就是=2(的3次方)+2的4次方+2(5)+2(6)+2(7)=8+16+32+64+128=248
然后如果是-8的话,行也倒是行,因为11111000的补码是-8,所以这就很难说
如果是我们信息学奥赛CSP或者是noip,noi,ctsc,apio,wc之类的竞赛
都是会告诉你原码反码补码的,一般正常的也会保留第一种248的
一个数字有很多表示方法,
比如无符号数会认为11111000代表的数是248
而原码则认为最高只表示符号,然后只计算低7位的结果,所以是-120
而反码则是在原码的基础上把负数的非符号位取反,所以是-7
最后是现在最常用的补码,即最高位作为-2^w而不是一个符号参与运算,那么补码结果就是-8