由此先引出一张图片
首先127的原码是01111111,补码是01111111.
128的原码是010000000,此处发生了符号位上溢,这里最高位加的0是为了更好的表示上溢的形式
128的反码是10000000,128的补码是10000000.正好满足char8位bit
之后进行整形提升变成11111111111111111111111110000000,因为128的补码最高位为1,所以是复数所以,printf输出的原码形式为10000000000000000000000010000000,为-128.
下面我们看一个更复杂的例题:
由于16位太多这里我简化成8位
首先-32767的原码是11111111,-32768的原码是100000000(发生了下溢),-32769的原码是100000001,我们对-32769取它的反码是01111110,再取它的补码为01111111,整型提升后为0000...00001111111,此处我们转换成原码是0000...00001111111,在之前我们看作了8位,其实在short int 里面有16位,在这里1的个数为15个,换成原码的值为32767.
下面是关于有符号和无符号之间的转换
以上是参考某位博主的代码
在c语言里面,执行按位运算的通常是按照补码形式来进行
比如原码-1,它是有符号的,现在我们使用unsigned来转换它,首先-1的原码是100000...01,补码为111111...11,printf输出其原码对应的数值
关于栈的使用:假设栈是满栈,其里面都是每次数据类型的范围,我们现在有一个指针,可以定位到每一个在栈里面数据的地址,入栈顺序为数据大小的顺序,关于第一个例子 char 128为什么等于-128,首先signed char的范围在-128到127之间,我们选定127后,指针找寻127上一个地址,发现上溢,指针从栈顶回到栈尾,指向-128,包括例2中首先short int的范围在-32768——32767,关于题目中-32769,指针从-32768向栈尾查找,发现下溢,则指针回到栈顶指向32767。
以上是我本次的第二部作品
谢谢大家!