求大神!!看不懂为啥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呢?
求详细过程。感谢感谢! 数据是以补码的形式存储的,正数的补码是本身,负数的补码是除符号位外其它位取反,再加上1,1111 1111 是 补码,转换成原码是 1000 0001,就是 -1. 同楼上,回去复习一下补码。 东辰木 发表于 2019-7-30 10:34
数据是以补码的形式存储的,正数的补码是本身,负数的补码是除符号位外其它位取反,再加上1,1111 1111 是...
明白了,谢谢! 风扫地 发表于 2019-7-30 11:06
同楼上,回去复习一下补码。
谢谢了 数据是以补码的形式储存的,
正数的补码和原码相同
负数的补码 = 原码取反 + 1;
例如 1 的原码:0000 0001(8位)
补码:0000 0001;
-1的原码:0000 0001(8位)
取反:1111 1110
加一:1111 1111
-127原码:0111 1111
取反:1000 0000
加一:1000 0001
Neverturnback 发表于 2019-7-30 11:12
数据是以补码的形式储存的,
正数的补码和原码相同
负数的补码 = 原码取反 + 1;
太感谢了小哥哥 Neverturnback 发表于 2019-7-30 11:12
数据是以补码的形式储存的,
正数的补码和原码相同
负数的补码 = 原码取反 + 1;
好详细啊!太感谢啦 小哥哥 {:9_232:} %hhd是啥意思 和%d有区别吗
页:
[1]