小代码背后的大道理

猴健居士 猴健居士     2022-09-01     782

关键词:

先看这段代码

通过指针可以直接访问内存,而在C#中这属于不安全操作,为了能让代码编译运行因此都要带上unsafe,这个不用管它。这段代码主要是借助单字节数据类型byte,直接访问内存,查看各种数据类型的数据在内存的存放情况。在往常认为整数0,1,2,3,4,5……之类的存放在内存的就是转换成二进制再放进去;而字符则是先通过字符编码转换,比如ASCII码A,B,C,D转换成01000001,01000010,01000011再放进去。当然这个层次还不够细。想当年在大学时代知道这些还算过得去了。直到最近再去看计算机科学之类的书籍才加深了自己对这方面的认知。

在学C的时候都有提过无符号数,而我们通常使用的都是有符号数。在整形而言有符号整形而无符号整形已是两套不同的编码:无符号整形是直接把十进制数转换成二进制;有符号整形需要把数转换成补码。补码原码反码之类的在大学里经常接触。但是记忆中老师好像没提到补码是存无符号整形的,倒是想再翻翻以前的教材里有没有提到。由于整形有short,int,long三种不同长度,如果二进制值超出了所存放类型的长度就会把高位舍去,这就造成所谓的数据溢出。有符号和无符号数的区别在于多了个符号,所以补码是把最高位留着作为符号位,既然二进制位的长度是定的,所以补码中表示数据的位数就少了一位,因此有符号数的最大正数会比无符号数的最大整数要小了。这好像扯远了。

虽然这些数字和字符转换成0101这样的二进制编码后就能存放在内存中,比如无符号整数12345,它转换成二进制就是0011 0000 0011 1001太长了,为了方便显示就转换成16进制表示30 39,而int类型是4个字节,1个字节8个位。这个值实际只占了2个字节,剩余的字节用0来补全,那么实际上是00 00 30 39。在无符号整数123456在内存中是否就以00 00 30 39来存放呢?运行一下代码

查看结果

发现刚好跟猜想相反。对于00 00 30 39 这串数据而言,00是高位,39是低位,测试的结果发现数字存放在内存中被高低位互换了。不过也不能妄下定论说数据经过高低位互换才放到内存中,实际上这里还涉及到字节顺序中大端法和小端法的概念。如果一个数据,它存放在内存中的字节顺序是从数据的高位一直到低位的,比如上面12345,存放顺序是 00 00 30 39。那这种就称为大端法,我理解是"大位靠前端法";与之相反,数据存放内存中字节顺序从低位到高位存放的,比如上面12345,存放顺序是39 30 00 00,这种称之为小端法,"小位靠前法"。C语言是移植性很强的语言。C#依靠DotNet Core也可以实现跨平台,我倒是没有在别的平台上运行过上面的代码。C语言也没有,但据说与上面类似的代码在Sun,Linux32,Linux64上运行,仅有Sun是显示00 00 30 39。也就是说只有Sun是使用了大端法来存储数据,其他平台都使用小端法来存储数据。当我们在主机与主机与间进行数据交互时,就要注意双方平台所用的字节顺序。鄙人在使用串口通讯时就遇到过这个场景,发送或接收一串数据,其中某几个字节是有用的数据,把数据取出来之后还需要高低位互换,才是所需要的数据。这就是一个很好的例子了。

00后面试要求月薪10万:董明珠vs“高能”实习生,面试大战背后蕴藏的那些职场硬道理

近日,芒果台新综艺《初入职场的我们》一经播出,就引起了众多网友的热议。因为节目打着董明珠综艺首秀的名号,所以小编也十分期待。果然在第一集“面试篇”中,节目组就开始搞事情,董明珠需要在... 查看详情

c语言求1-1/3+1/5-1/7+...——小程序,大道理(代码片段)

问题:用C语言编写程序求1-1/3+1/5-1/7+...示例:1#include<stdio.h>2voidmain()3intn=1;4floatsum=0,a=1;5while(a<=100)6sum=sum+n/a;7n=-n;8a=a+2;910printf("%f\n",sum);11分析:数列的求和问题,每一项正负交替,并且分母递增2。首先,这是一个加法(累 查看详情

小程序大道理引用的用途

#include#includeusingnamespacestd;intmain()stringstr="Gdkknvnqkc";for(auto&s:str)s=s+1;for(autos:str)cout<<s;cout<<endl;for(autos:str)s=s-1;for(autos:str)cout<<s;cout& 查看详情

马云宣布即将卸任:这4个人生道理,早懂早受益

...序渐进呢?我们看到别人一夜之间平步青云,不过是他们背后的积累不为我们所知而已。成功没有一步登天,只有聚沙成塔。哪个外语流利的人不是一个单词一个单词练起来的?哪个文笔好的作者不是一句话一句话写出来的?再... 查看详情

andoird性能优化-死锁监控与其背后的小知识(代码片段)

前言“死锁”,这个从接触程序开发的时候就会经常听到的词,它其实也可以被称为一种“艺术”,即互斥资源访问循环的艺术,在Android中,如果主线程产生死锁,那么通常会以ANR结束app的生命周期,... 查看详情

读完《大道至简》后的小感悟

     初次看到《大道至简》这本书的书名时,我被震惊到了,当时觉得十分奇怪,一本讲计算机编程的书怎么会有一个如此文雅的名字?上网搜索这本书,发现学界对这本书的评价还是十分高的,周爱明老师的... 查看详情

大道至简读后感

...。作为一个程序员,不仅仅要掌握招数与方法,更要明白背后的道理,只有这样,才能在碰到变化时解决问题。        八个章节讲述了软件开发的各个方面,层层深 查看详情

收款神器!解读聚合收款码背后的原理(代码片段)

Hello,我是楼下小黑哥!今天跟大家分享一下聚合收款码的支付原理,这也是我这大半年来一直在做的项目。微信/支付宝收款码大家应该不会陌生,线下小微商户收款大多使用这个,就比如下图。这种收款方... 查看详情

行政小姐姐破天荒的求助程序员?背后究竟发生了怎么样的故事?

前言你以为程序员一无是处???除了写代码就啥也不会了吗?不,还能利用专业知识给小姐姐摸鱼呢!原文首发地址请点击这里!!(包含视频演示效果)原文首发地址请点击这里!!(包含视频演示效果)原文首发地址请点... 查看详情

那些不起眼的小工具?(代码片段)

前言原文链接源码地址今天想写一篇关于下划线这个库中一些小工具函数的故事,我们都听过一句话,一个成功的男人背后一定有一个了不起的女人(?,其实也不一定,也许还有男人呢),那么一个经久不衰,为程序猿们所称道的... 查看详情

几条建议1精华的职场道理,年轻时候知道就好了

...但是也要懂得防备人,家事,私事少跟别人说,不说领导背后坏话,明面上学会夸人,背地里少去损人3 同样的错误最多犯两次,第一次不知 查看详情

if快还是switch快?解密switch背后的秘密(代码片段)

这是我的第57篇原创文章条件判断语句是程序的重要组成部分,也是系统业务逻辑的控制手段。重要程度和使用频率更是首屈一指,那我们要如何选择if还是switch呢?他们的性能差别有多大?switch性能背后的秘密是什么?接下来... 查看详情

小小的likely背后却大有玄机!(代码片段)

作者|张彦飞allen来源|开发内功修炼今天我给大家分享一个内核中常用的提升性能的小技巧。理解了它对你一定大有好处。在内核中很多地方都充斥着likely、unlikely这一对儿函数的使用。随便揪两处,比如在TCP连接建立的过程... 查看详情

测试的道理(代码片段)

...错误的做法传授给新手,造成恶性循环。本来目的是提高代码质量,结果不但没能达到目的,反而降低了代码质量,增大了工作量,大幅度延缓工程进度。我也写测试, 查看详情

华为公司“奇葩”面试题流出:高薪背后的3个认知层次,你在哪一层?(代码片段)

👇👇关注后回复 “进群” ,拉你进程序员交流群👇👇文 / 小椰子  微信:小椰子专栏(ID:xiaoyezizhuanlan)01前段时间,华为公司的一道面试题刷屏,火上了热搜。题目是这样的:一头牛重800... 查看详情

大道至简读后感

...顺序,分支,循环。但是又不能去埋头眼中只有不停的敲代码,这本书中从始至终都有在以反面 查看详情

gotodefinition的背后操作vs2015c#

...个变量的声明,比如某组件的gameObject变量,会看到如下代码一看似乎有点晕,这代码什么意思啊,就一个publicGameObjectgameObject{get;}这有点像属性的简洁声明:但事实是这样的吗? 经过测试,并非如此写一个小程序来验证下就... 查看详情

大道至简伪代码

import.java.大道至简.*;import.java.愚公移山.*;publicclassYugongyishan//定义一个名为愚公移山的类,public访问控制符{//类定义的开始publicstaticvoidmain(String[]args)//共有主函数,说明事情的原因开始经过结果{//主程序的开始//定义类成员,说明... 查看详情