**
"有符号数和无符号数"学习笔记
**
缘由
学习《计算机系统基础》关于有符号数和无符号数的章节后,对于老师举的例子还不是很清楚,就想着把一些东西记录下来,以便以后复习时使用
参考了CSDN上某位博主的文章和中国大学MOOC上袁春风老师的课程,链接如下:
CSDN博主文章:https://blog.csdn.net/daiyutage/article/details/8575248
袁春风老师MOOC:https://www.icourse163.org/learn/NJU-1001625001?tid=1460891441#/learn/content?type=detail&id=1237325733&cid=1257246654
基本概念
1、计算机内部数据按照“补码”形式存储,以减少“原码”和“反码”本身存在的部分问题【详见CSDN博主的文章】
2、计算机内部数据比较大小,若同时存在“有符号数”(普通int,char,long long)和“无符号数”(有unsigned符号:unsigned int ,unsigned char, unsigned long long),则c语言编译器强制将“带符号整数”转换为“无符号整数”,从而进行后序比较
3、负数的补码:通过对负数原码除符号位外的数值位按位取反(得到反码),后进行“+1”运算,得到补码
eg:-123:
原码:1111 1011
反码:1000 0100
补码:1000 0101
*小贴士:原码变为补码:也可以看做(从右往左遇到的第一个“1”前面除符号位外各位取反)
[补码1111 1011变为1000 0101];
而补码变回原码:若补码第一个符号为"1",则为负数, 则除符号位外,数值各位取反,末位加1
[1000 0101 变为 1111 1011 ]
4、正数的原码、反码、补码均为其本身
MOOC重要PPT
逐条解析:
小提示:*“U”代表unsigned,即无符号数;通过int型,
1、存在有符号数(0)和无符号数(0U)时,由“##基本概念第二点”提到的将带符号的数转换为无符号数进行比较,结果两者相同
2、“-1“和”0”都是代表“有符号数”,所以通过比较两者补码可知,两者补码分别为【1111 1111B】和【0000 0000B】,由于第一位是符号位,所以-1<0
3、由于“0”后面有‘U’的记号,显示为无符号数,结合(1)中解释,将“-1”也看做‘无符号数’,从而与“0”进行相应比较,而无符号数“-1”的补码[1111 1111B]被机器解释为2^32-1,远大于0
4、先判断是“带符号数”,由于“2147483647”是2^31-1,被机器用补码形式记录为[Ox7FFF FFFF] (16进制表示),而“-2147483647-1”被机器用补码形式记录为[Ox8000 0001],根据有符号位数比较,第一个数大于第二个数
5、由于两者需要转化为’无符号数’进行比较,结合(4)可知,“2147483647”和“-2147483647-1”的16进制,则第一个数小于第二个数
6、由于“(int)2147483647U”先转为无符号类型,最终仍被强制转化为int型数据(带符号位),所以原式是两个带符号位的比较,由于“2147483648,即231”的无符号数表示为[1000……0B],被机器解释为32位带符号数时,其值为最小负数-2(32-1)=-2^31=-2147483648;而“2147483647”是正数,所以第一个大于第二个,
7、由于“-1”和“-2”都是带符号数的7、由于“-1”和“-2”都是带符号位的数据,所以结合二者负数的补码进行比较,可知-1>-2
8、和(7)不同,此处-1是(unsigned),即无符号数,由(1)知,两者需转化为无符号数进行比较,得到第一个数仍大于第二个数
小提示:比较下(2)(3)、(4)(5)、(7)(8),三者都是前者带符号位,后者不带符号位,结果出现了大小上的不同!
测试代码运行
// C语言代码
int x=-1;
unsigned u=2147483647;
printf("x = %u = %d\n",x,x");
printf("u = %u = %d\n",u,u");
//输出结果:
x = 4294967295 = -1
u = 2147483647 = 2147483647
//c语言代码
int x=-1;
unsigned u=2147483648;
printf("x = %u = %d\n",x,x");
printf("u = %u = %d\n",u,u");
//输出结果
x = 4294967295 = -1
u = 2147483648 = -2147483648
运行代码出现的结果你还没搞懂 还有前面“##重要PPT”下面第六小题为何被机器解释为32位带符号数时,其值为最小负数-2(32-1)=-231=-2147483648,需要后续进行思考了。
参考资料
CSDN博客:https://blog.csdn.net/daiyutage/article/details/8575248
中国大学MOOC教材:https://www.icourse163.org/learn/NJU-1001625001?tid=1460891441#/learn/content?type=detail&id=1237325733&cid=1257246654