二进制详解
一、原码,反码,补码
在 C 语言里数据类型有 有符号数 和 无符号数 之分。
只有有符号数才有原码,反码,补码的概念,因为有符号数的最高位表示正负。
而无符号数不管怎么样都是表示正数,所以它的原码,反码,补码都是一样。
在计算机中为了计算方便,所有数据都是以补码的形式存储的。
因为这样减法运算也可以按照加法来运算,这就很巧妙了。
举个例子:0,-0,21.65625,-21.65625的原码,反码,补码分别是多少?
(所有的数据类型都可以这样运算,为了方便,这里仅展示计算方式,不涉及相关数据大小)
十进制数 | 原码 | 反码 | 补码 |
0 | 0000 0000 0000 0000 | 0000 0000 0000 0000 | 0000 0000 0000 0000 |
-0 | 1000 0000 0000 0000 | 1111 1111 1111 1111 | 0000 0000 0000 0000 |
18 | 0000 0000 0001 0010 | 0000 0000 0001 0010 | 0000 0000 0001 0010 |
-18 | 1000 0000 0001 0010 | 1111 1111 1110 1101 | 1111 1111 1110 1110 |
21.65625 | 0001 0101.1010 1000 | 0001 0101.1010 1000 | 0001 0101.1010 1000 |
-21.65625 | 1001 0101.1010 1000 | 1110 1010.0101 0111 | 1110 1010.0101 1000 |
(从这个表中可以清楚的看到所有的加减法运算都可以用加法来进行运算)
原码,反码,补码的运算方式:
1、正数的原码,反码,补码 都一样。
2、负数的原码在正数的原码基础上,将正数的最高位改为 1。
负数的反码在负数的原码基础上,除最高位不变外,其他位都取反。
负数的补码在负数的反码基础上,将反码的最后一位加 1。
二、符号位,阶码,尾数
在计算机内部实数都是以 (符号位-阶码-尾数) 的形式表示的。
一个 float 型实数在内存中占 4byte,即 32bit。
从低位到高位依次叫 第0位 到 第31位。这 32位 可以分成 3个部分:
1、符号位(第31位) --- 0表示正数,1表示负数。
2、阶码(第30位 到 第 23位) ---
这8个二进制位表示该实数转化为规格后的二进制实数后的指数与127之和(即所谓的阶码)。(127即所谓的偏移量)
规格化后的二进制实数的指数只能在 -127 到 +127 之间。
3、尾数(余下的23位) --- 即小数点后的23位。
double 类型:(8byte,即 64bit)
1、符号位(第31位) --- 0表示正数,1表示负数。
2、阶码(第30位 到 第20位)。规格化后的二进制实数的指数只能在 -1023 到 +1023 之间。
3、尾数(余下的52位) --- 即小数点后的52位。
举个例子(float类型):1.5,-1.5 符号位,阶码,尾数,及在计算机内存中的表示(16进制)
十进制数 | 二进制实数 | 符号位 | 阶码 | 尾数 | 内存中的表示(2进制) | 内存中的表示(16进制) |
0.75 | 1.1*2^-1 | 0 | 0111 1110 | 1 | 0011 1111 0100 0000 0000 0000 0000 0000 | 3F 40 00 00 |
-0.75 | -1.1*2^-1 | 1 | 0111 1110 | 1 | 1011 1111 0100 0000 0000 0000 0000 0000 | BF 40 00 00 |
1.5 | 1.1*2^0 | 0 | 0111 1111 | 1 | 0011 1111 1100 0000 0000 0000 0000 0000 | 3F C0 00 00 |
-1.5 | -1.1*2^0 | 1 | 0111 1111 | 1 | 1011 1111 1100 0000 0000 0000 0000 0000 | BF C0 00 00 |
3.0 | 1.1*2^1 | 0 | 1000 0000 | 1 | 0100 0000 0100 0000 0000 0000 0000 0000 | 40 40 00 00 |
-3.0 | -1.1*2^1 | 1 | 1000 0000 | 1 | 1100 0000 0100 0000 0000 0000 0000 0000 | C0 40 00 00 |
5.625 | 1.01101*2^2 | 0 | 1000 0001 | 01101 | 0100 0000 1011 0100 0000 0000 0000 0000 | 40 B4 00 00 |
-5.625 | -1.01101*2^2 | 1 | 1000 0001 | 01101 | 1100 0000 1011 0100 0000 0000 0000 0000 | C0 B4 00 00 |
三、逻辑运算
逻辑运算符 | 名称 | 说明 |
<< | 左移 | 左移n位代表乘2^n |
>> | 右移 | 右移n位代表除2^n |
| | 位或 | 即全为0则为0 |
& | 位与 | 即全为1则为1 |
~ | 位非 | 即 ~1 得 0,~0 得 1 |
^ | 位异或 | 即相同为 0,不同为 1 |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· C# 13 中的新增功能实操
· Ollama本地部署大模型总结
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(4)
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 2025成都.NET开发者Connect圆满结束