18919735107 发表于 2022-10-19 11:03:37

不理解

1111 1111   用   int 的视角去翻译,它就是 255;用 char 的视角去翻译,它就是 -1
大佬,这个用char视角是怎么理解的?

tommyyu 发表于 2022-10-19 11:07:41

补码

jackz007 发表于 2022-10-19 12:07:50

本帖最后由 jackz007 于 2022-10-19 13:16 编辑

1111 1111
      是对十进制数 255 的二进制表达,其实,在计算机内部,数字就是数字,根本不存在进制,所谓的进制,只不过是为了迎合人类的习惯,只有在人机交互的时候才需要的东西,不同的进制,实际上只是同一个东西不同的表达形式而已。就比如这个 1111 1111,这是二进制的形式,八进制形式是 377,十进制形式是 255,十六进制形式是 0xff,其实它们就是同一个数值,只是看上去 "样子" 不同而已。

      当然,如果这个二进制数值是一个 char 型变量的话,那么,它的数值就是 -1,这是 char 型变量的数值范围(0 ~ 127,-128,-1)所决定的,这是因为需要把 char 一共 8 位的存储空间分一半给负值,而这个数值恰好落入了负值的区间造成的。如果这个二进制是 unsigned char 的值,那么,它就又是 255 了,因为,unsigned char 的数值范围是 0 ~ 255,不需要分一半空间给负值。

cjgank 发表于 2022-10-19 12:30:32


二进制源码:1111 1111对应 不带符号位十进制的255

二进制源码:1111 1111,反码是:1000 0000,补码是:1000 0001(即带符号十进制的-1)

两手空空儿 发表于 2022-10-21 14:51:07

楼主估计是初学,我比你早学几天,把我的理解说一下:
电脑里存的永远都是0和1的一串数字,要让这些0和1有意义,就看我们怎么使用它,数据类型这个东西就可以起作用了
同样是1111 1111,
它是int的时候,是这个样子的 0000 0000 0000 0000 0000 0000 1111 1111,4个字节,符号位是0,它是正数,它的10进制值就是255
它是char的时候,它只占用1个字节,1111 1111,char是有符号的,这时的符号位是1,是个负数,负数是用补码存储的(参看2楼的链接),把它转回原码是 1000 0001,它的10进制数值是 -1
我是理解了指针以后才理解了数据类型这个东西,不同类型的指针,在+1的时候跳的地址数量不一样,这是根据指针的类型来判断的,学到数组指针的时候,这个现象最明显。

howzyao 发表于 2022-10-21 17:38:15

本帖最后由 howzyao 于 2022-10-21 17:42 编辑

我也是早学几天的初学者,我的理解:
首先,char值域是:
0x0000 0000 这么长
整型值域:
0x0000 0000 0000 0000== 0
0x0000 0000 0000 0001== 1
0x1000 0000 0000 0000== -0
0x1000 0000 0000 0001== -1
0x0111 1111 1111 1111 == 128 +[+1+2+4+8 + 16 +32 + 64 +(128==0) ] = 127 == 128 + 127 = 255

因此,127+1 ==128 +上之前的8个1也是128 == 256
256表示为:
0x1111 1111 1111 1111
明显,最高位(个人喜欢叫它最左位)这是一个不能被占用的位,所以只能少一个最高位,而最高位表达的是128,
此时少一个128,所以一个整型,最大只能是255

char的视角看int,int就太长了,只能是127最大char了,因为最左位不能是1.
大家来说说这理解的对吗

wuchenghua 发表于 2022-10-21 18:45:15

学习了
页: [1]
查看完整版本: 不理解