加强网站建设和维护福州营销网站建设模板
news/
2025/9/27 18:56:39/
文章来源:
加强网站建设和维护,福州营销网站建设模板,企业管理培训课程感想,禹城市网站建设一、引出问题
在学习C语言单目操作符中~按位取反的过程中#xff0c;对这样一段代码的结果产生了疑惑#xff1a;
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.hint main() {int a 0;int b ~a;//按位取反printf(%d\n, b);return 0;
}输出结果…一、引出问题
在学习C语言单目操作符中~按位取反的过程中对这样一段代码的结果产生了疑惑
#define _CRT_SECURE_NO_WARNINGS 1
#include stdio.hint main() {int a 0;int b ~a;·//按位取反printf(%d\n, b);return 0;
}输出结果
-1首先int整型占4个字节0化为二进制形式为00000000 00000000 00000000 00000000这样按位取反后是11111111 11111111 11111111 11111111化为十进制不应该是一个很大的负数吗而输出结果却为-1。
之后我查阅资料才发现我忘记了负数在计算机内存中是以补码的方式存储和进行运算的。于是我又将原码、反码、补码相关的知识复习了一遍温故而知新重新总结如下。
二、深入理解原码、反码、补码
在计算机中数字的二进制位的第一位是符号位0为正1为负
首先要明白原码、反码、补码是计算机用于表示带符号整数的三种编码方式
原码原码最高位为符号位其余位为数值绝对值的二进制值如5的原码是0000 0101-5的原码是1000 0110。原码表示最直观但在进行加减法运算时存在问题如5-5理论上等于0但原码相加得1000 1011并不是0000 0000反码正数的反码与原码相同负数的反码是将原码符号位不变其余位按位取反。如5的反码即原码0000 0101-5的反码为1111 1010。 引入反码是为了更好的解决二进制正数与负数间的加减法问题如5-6即0000 0101 1111 1001 1111 1110反码转为原码即符号位不变其余位取反得1000 0001正好是-1。 但反码仍然存在溢出和零的表示问题如-56即1111 1010 0000 0110 溢出得0-55即1111 1010 0000 0101 1111 1111反码转为原码即1000 0000这就与0000 0000的0的原码表示方式存在冲突一个数总不能有两种表示方法吧。于是就有了下面的补码。补码正数的补码与原码相同负数的补码是将负数的原码符号位不变其余位取反后再加1即负数的反码1。如5的补码即原码0000 0101-5的补码为1111 1011。 补码的引用很好的解决了加减法和0的表示问题还能够自然地处理溢出下面验证一下 -65即1111 1010 0000 0101 1111 1111转为原码补码-1符号位不变其余位取反得1000 0001即-1没毛病。-56即1111 1011 0000 0110 溢出且得0000 0001正数即原码本身得1没毛病。-55即1111 1011 0000 0101 溢出且得0000 0000与0的原码表示相同没毛病。 由此可见在计算机中补码是最常见和最有效的带符号整数表示方式。 因此在计算机中带符号的整数在内存中存储的是其二进制的补码。
那么这就可以理解结果为什么为-1而不是一个很大很大的负数以上代码的计算过程如下
//a0的补码也是原码
00000000 00000000 00000000 00000000
//~取反运算得到b的补码
11111111 11111111 11111111 11111111
//补码-1
11111111 11111111 11111111 11111110
//符号位不变按位取反得到原码
10000000 00000000 00000000 00000001即得到打印出来的结果为-1
终于破案了~
三、关于原码、反码、补码之间的转换
1.对于正数原码 反码 补码 2.对于负数此图足以
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/919819.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!