<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>archive</title><link>https://archive-w.netlify.app/corner/numeration/</link><description>Recent content on archive</description><generator>Hugo</generator><language>zh-CN</language><atom:link href="https://archive-w.netlify.app/corner/numeration/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://archive-w.netlify.app/corner/numeration/complement/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/corner/numeration/complement/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introcomplement">
 Intro(Complement)
 &lt;a class="anchor" href="#introcomplement">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>
&lt;h3 id="重新认识计算机中的数字表示">
 重新认识计算机中的数字表示
 &lt;a class="anchor" href="#%e9%87%8d%e6%96%b0%e8%ae%a4%e8%af%86%e8%ae%a1%e7%ae%97%e6%9c%ba%e4%b8%ad%e7%9a%84%e6%95%b0%e5%ad%97%e8%a1%a8%e7%a4%ba">#&lt;/a>
&lt;/h3>
&lt;div class="alert callout attention">&lt;p class="title">&lt;span class="icon icon icon-attention">&lt;/span> 主要以一个字节，8比特位进行分析 &lt;/p>&lt;p> 首先要知道计算机中的数字表示有空间限制，比如 java 中 byte 类型就用一个字节(8 bit)表示，而 int 得用 4byte（32 bit）。而且 java 默认都是有符号的，也即第一个比特位表示符号，一个byte 类型的变量可表示的值就是 &lt;span class="math inline">\(00000000\)&lt;/span> - &lt;span class="math inline">\(11111111\)&lt;/span>。
&lt;br>&lt;br>&lt;span style='color: blue'>还有一点至关重要，就是进位后的值超出 8 位后会截断。比如 &lt;span class="math inline">\(11111111 + 1 = 1{\hspace{0.5em}}00000000 ==截断==> 00000000 \)&lt;/span>&lt;/span>，要不然就没法循环了，跟钟表一样，到极限得归位。
&lt;br>&lt;br>至于这些值表示的实际意义，可以在下面慢慢进行分析。（先不用考虑补码）
&lt;br>&lt;code>1).&lt;/code>: 首先分析正数，总共 8 位，一个符号位占一个[0],剩下的 7 位表示值的话就就是 &lt;span class="math inline">\(00000000\)&lt;/span> - &lt;span class="math inline">\(01111111\)&lt;/span> 表示数值 0 到 127，这个毋庸置疑的。
&lt;br>&lt;code>2).&lt;/code>: 不管一个负数怎么表示，都应该符合我们的理性认知。比如 -1 + 1 的值肯定是 0 的。
&lt;br>&lt;code>3).&lt;/code>: 现在有了正数值比如 1 (&lt;span class="math inline">\(00000001\)&lt;/span>)，加一操作后肯定等于 0。也即 &lt;span class="math inline">\(00000001\)&lt;/span> + &lt;span class="math inline">\(8(*) = 00000000\)&lt;/span>
&lt;br>&lt;code>4).&lt;/code>: 目前只有让 &lt;span class="math inline">\(8(*)\)&lt;/span> 这个未知值在加完后整体位溢出，被截断，才能达到加完一个值后更小。
&lt;br>&lt;code>5).&lt;/code>: 所以此处的 &lt;span class="math inline">\(8(*)\)&lt;/span> 二进制表示应该是 &lt;span class="math inline">\(11111111\)&lt;/span>，加完 &lt;span class="math inline">\(00000001\)&lt;/span> 后得到 &lt;span class="math inline">\(1{\hspace{0.5em}}00000000\)&lt;/span>，截断，然后正好等于 &lt;span class="math inline">\(00000000\)&lt;/span>。
&lt;br>&lt;code>6).&lt;/code>: 所以才让这个二进制 &lt;span class="math inline">\(11111111\)&lt;/span> 表示的 -1。
&lt;br>&lt;br>&lt;code>7).&lt;/code>: 其他情况依次了类推，重要的是理解截断才能循环。再举个例子（-128）。
&lt;br>&lt;code>8).&lt;/code>: 已知上述得出的 -1&lt;span class="math inline">\((11111111)\)&lt;/span>，和127&lt;span class="math inline">\((01111111)\)&lt;/span>，所以 -128 &lt;span class="math inline">\(8(*)\)&lt;/span> + 127 &lt;span class="math inline">\(01111111\)&lt;/span> = -1 &lt;span class="math inline">\(11111111\)&lt;/span>
&lt;br>&lt;code>9).&lt;/code>: 后面的值在二进制表示上要比被加数大，所以这次不用截断，给 &lt;span class="math inline">\(8(*)\)&lt;/span> 值设为 &lt;span class="math inline">\(10000000\)&lt;/span> 即可。也就是 -128 = &lt;span class="math inline">\(10000000\)&lt;/span>
&lt;br>&lt;br>为了更好的理解数据的分布，可以画一个圆来表示，方便记忆。范围: &lt;span class="math inline">\([{\color{red}-(2^{8*size-1})}\)&lt;/span> , &lt;span class="math inline">\({\color{red}(2^{8*size-1})-1}]\)&lt;/span>，size = 1 时：[-128, 127].
&lt;br>&lt;img src="https://archive-w.netlify.app/.images/corner/numeration/complement/cpt-byte-show-02.png" alt="" width="100%">&lt;/p></description></item><item><title/><link>https://archive-w.netlify.app/corner/numeration/endianness/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://archive-w.netlify.app/corner/numeration/endianness/</guid><description>&lt;ul>
&lt;li>
&lt;h2 id="introendianness--字节序--端序--尾序">
 Intro(ENDIANNESS | 字节序 | 端序 | 尾序)
 &lt;a class="anchor" href="#introendianness--%e5%ad%97%e8%8a%82%e5%ba%8f--%e7%ab%af%e5%ba%8f--%e5%b0%be%e5%ba%8f">#&lt;/a>
&lt;/h2>
&lt;p class="warn">


 &lt;a href="https://zh.wikipedia.org/wiki/字节序" rel="noopener" target="_blank">参考 wiki&lt;/a>，记录这个是因为老是记不住，天天查，所以已自己比较容易记忆的方式将其记录下来，动手过一遍，避免胡翻乱找。
&lt;br>&lt;br>字节序分为大端（Big）和小端（Little）
&lt;br>&lt;span style='padding-left:2em'>&lt;strong>高位低地址，低位高地址被称为大端序（Big   ）&lt;/strong>，参考下图可以理解为 &lt;strong>顺序放置&lt;/strong>。&lt;/span>
&lt;br>&lt;span style='padding-left:2em'>&lt;strong>低位低地址，高位高地址被称为小端序（Little）&lt;/strong>，参考下图可以理解为 &lt;strong>逆序放置&lt;/strong>。&lt;/span>
&lt;br>&lt;br>大小端序出现的背景：
&lt;br>&lt;span style='padding-left:2em'>计算机都是从低位往高位读取字节数据，而且方便处理，所以出现了小端序。但是小端序不符合人类的阅读习惯，且除了计算机内部之外，其他场合几乎都是大端字节序，比如网络传输一般采用大端序，也被称为 &lt;strong>网络字节序&lt;/strong>，或 &lt;strong>网络序&lt;/strong>。有 


 &lt;a href="https://zh.wikipedia.org/wiki/Berkeley套接字" rel="noopener" target="_blank">Berkeley套接字&lt;/a> 定义了一组转换函数，用于 16 和 32 位整数在网络序和本机字节序之间的转换。htonl(Host to Network Long(4Byte))，htons(Host to Network Short(2Byte))用于本机序转换到网络序；ntohl，ntohs用于网络序转换到本机序。
&lt;br>&lt;br>&lt;img src="https://archive-w.netlify.app/.images/corner/numeration/endianness/endianness-layout-01.png" alt="" width="100%">&lt;/p>
&lt;ul>
&lt;li>
&lt;h3 id="检测处理器字节序">
 检测处理器字节序
 &lt;a class="anchor" href="#%e6%a3%80%e6%b5%8b%e5%a4%84%e7%90%86%e5%99%a8%e5%ad%97%e8%8a%82%e5%ba%8f">#&lt;/a>
&lt;/h3>
&lt;div class="alert callout note">&lt;p class="title">&lt;span class="icon icon-note">&lt;/span> Note &lt;/p>&lt;p> 使用 C 语言程序即可验证：定义一个整形值&lt;code>int num = 1 = 0x 0000 0000 0000 0001;&lt;/code>，然后强转成字符指针，取第一个字符（1 Byte）判断是否为 0，(小端逆序放置为 1，大端为 0)。
&lt;br>编辑如下代码为 endian.c
&lt;br>编译运行：&lt;code>gcc endian.c -o endian &amp;amp;&amp;amp; ./endian&lt;/code>&lt;/p>
&lt;/p>&lt;/div>
&lt;div class="outer yosemite">&lt;div class="dot red">&lt;/div>&lt;div class="dot amber">&lt;/div>&lt;div class="dot green">&lt;/div>&lt;/div>
&lt;div class="code-toolbar">&lt;pre data-lang="c" data-line="" data-file="endian.c" class="language-c line-numbers" style="max-height: none">&lt;code class="language-c">#include &amp;lt;stdio.h&amp;gt;

int main(){
 unsigned int num = 1;
 char *ptr = (char*) &amp;amp;num;

 if (*ptr) printf(&amp;quot;Little\n&amp;quot;);
 else printf(&amp;quot;Big\n&amp;quot;);

 return 0;
}
&lt;/code>&lt;/pre>&lt;/div>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>
&lt;h2 id="reference">
 Reference
 &lt;a class="anchor" href="#reference">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>


 &lt;a href="https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F" rel="noopener" target="_blank">https://zh.wikipedia.org/wiki/%E5%AD%97%E8%8A%82%E5%BA%8F&lt;/a>&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul></description></item></channel></rss>