lomoxxt 发表于 2019-7-30 10:13:46

求大神!!看不懂为啥255变成了-1

本帖最后由 lomoxxt 于 2019-7-30 10:25 编辑

#include <stdio.h>

int main()
{
      signed char i;
   
      i = 255;
   
      printf("signed char %hhd\n", i);

      return 0;
}
…………………………………………………………………………………………
打印结果是-1,答案解析char 类型占一个字节的空间,因此 unsigned char 的取值范围是 0~255,signed char 的取值范围则是 -128~127。十进制的 255 即二进制的 11111111,signed char 第一位为符号位,因此其值转换为十进制后是 -1。

前面一直到“signed char 第一位为符号位”这句还明白,最后一句看不懂——请问怎么转换成-1了呢?
1111 1111 不是应该是-127吗?为啥变成了-1呢?
求详细过程。感谢感谢!

东辰木 发表于 2019-7-30 10:34:27

数据是以补码的形式存储的,正数的补码是本身,负数的补码是除符号位外其它位取反,再加上1,1111 1111 是 补码,转换成原码是 1000 0001,就是 -1.

风扫地 发表于 2019-7-30 11:06:29

同楼上,回去复习一下补码。

lomoxxt 发表于 2019-7-30 11:10:26

东辰木 发表于 2019-7-30 10:34
数据是以补码的形式存储的,正数的补码是本身,负数的补码是除符号位外其它位取反,再加上1,1111 1111 是...

明白了,谢谢!

lomoxxt 发表于 2019-7-30 11:11:15

风扫地 发表于 2019-7-30 11:06
同楼上,回去复习一下补码。

谢谢了

Neverturnback 发表于 2019-7-30 11:12:12

数据是以补码的形式储存的,
正数的补码和原码相同
负数的补码 = 原码取反 + 1;
例如 1 的原码:0000 0001(8位)
补码:0000 0001;
-1的原码:0000 0001(8位)
取反:1111 1110
加一:1111 1111

-127原码:0111 1111
取反:1000 0000
加一:1000 0001

lomoxxt 发表于 2019-7-30 11:14:23

Neverturnback 发表于 2019-7-30 11:12
数据是以补码的形式储存的,
正数的补码和原码相同
负数的补码 = 原码取反 + 1;


太感谢了小哥哥

lomoxxt 发表于 2019-7-30 11:15:14

Neverturnback 发表于 2019-7-30 11:12
数据是以补码的形式储存的,
正数的补码和原码相同
负数的补码 = 原码取反 + 1;


好详细啊!太感谢啦 小哥哥 {:9_232:}

Temper. 发表于 2020-10-30 09:27:25

%hhd是啥意思 和%d有区别吗
页: [1]
查看完整版本: 求大神!!看不懂为啥255变成了-1