hujiezhong 发表于 2021-3-14 15:37:24

这个while循环为什么是这样的


#include <stdio.h>

int main()
{
      signed char i = 0;

      while (i <= 0)
      {
                printf("%d", i);
                i = i - 1;
      }

      return 0;
}
为什么这个程序执行出来是0~128啊,我寻思着它的i不是越来越少吗
大佬们解决一下!!!

洋洋痒 发表于 2021-3-14 15:39:51

{:10_285:}

洋洋痒 发表于 2021-3-14 15:42:34

继续往下学把
学到数据的存储你就理解了

洋洋痒 发表于 2021-3-14 16:10:28

char 存储8个比特位
signed char说明首位是符号位
整数存储方式都是补码——正数反码,补码,原码都相同
—————————————负数 例子-1原码1000 0001(首位代表符号位1为负 0为正)   反码首位不变其他位取反 1111 1110   补码是在反码的基础上加1,即为 1111 1111


0-1=1111 1111 (-1)
   ………………
1000 0001-1=1000 0000 (-128)
1000 0000 -1=0111 1111 (127)停止循环


能看懂就看懂,看不懂就等你学到数据的存储就懂了

hujiezhong 发表于 2021-3-14 19:19:21

说实话,我只能看懂一点点,不能懂多了,比如你那个-1化二进制我知道,但是怎么化成127的我就不知道了,不过还是听大佬的吧,等时侯,一定懂

洋洋痒 发表于 2021-3-14 19:55:13

hujiezhong 发表于 2021-3-14 19:19
说实话,我只能看懂一点点,不能懂多了,比如你那个-1化二进制我知道,但是怎么化成127的我就不知道了,不过还 ...

1000 0000是-128,这个没办法用原码反码解释,就是-128的补码
1000 0000-1就变成0111 1111了
首位是符号位0代表正数 111 1111是127的二进制即0111 1111是+127


概括一句话就是把首位的1借下来了变0了就是变正数了

wodeaidelicious 发表于 2021-3-15 18:03:57

是不是编译器的缘故,我复制了你的程序,在DEV C++就是0到-128。结果是0-1-2-3-4-5-6-7-8-9……-128.数之间是负号。
页: [1]
查看完整版本: 这个while循环为什么是这样的