”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 每周博客:本周我遇到的四件有趣的事情

每周博客:本周我遇到的四件有趣的事情

发布于2024-11-08
浏览:988

1. 避免 VS Code 中文件名混淆

在VS Code中编写C文件时,我将一个文件命名为first.c.cpp。完成程序后,我在执行过程中遇到了错误。经过30分钟的排查,我发现问题出在文件名:
.c 扩展名导致 IDE 错误地将其识别为 C 程序,导致 VS Code 使用 gcc(C 编译器)而不是 g(C 编译器)来编译我的代码。

Weekly Blog: Four Interesting Things I Encountered This Week

说明文字:真傻!

  • 解决方案:在tasks.json文件中,将“命令行”行从 gcc 更改为 g .
  • 经验教训:对 C 文件使用清晰的 .cpp 扩展名以避免不必要的混乱。

2.Java的跨平台设计理念

Java的设计理念与传统编译型语言有显着不同:

传统编译:

  1. 像C这样的语言直接编译成特定的机器代码 平台(例如 Windows、Mac、Linux)
  2. 生成的可执行文件(.exe)只能在目标平台上运行

Java的方法:

  1. 编译器生成中间代码(字节码)
  2. 此字节码可以在安装了 Java 虚拟机 (JVM) 的任何平台上运行
  3. JVM负责将字节码翻译成当前平台的机器码

这种设计实现了“一次编写,随处运行”的目标,而 C 可执行文件(.exe 文件)仅限于在单个平台上运行。

  • 优点:同一个程序无需修改即可在不同计算机上运行

  • 缺点:与传统方法相比,过程中的额外步骤可能会使编译速度稍微慢一些

一次编写,随处运行

                             ---------James Gosling

3. 两种常见的编译模式

  • 调试模式面向调试,优化较少。主要用于调试程序。
  • Release模式主要用于生成release版本,注重优化,只保留基本的调试功能。

Weekly Blog: Four Interesting Things I Encountered This Week

4. 从底层角度理解强制类型转换

Little Endian:最低有效字节存储在最低地址。这种存储方法的出现是为了方便CPU从低地址到高地址读取内存。有趣的是,这与人类通常写数字相反。
例如
329933 的二进制表示为 00000000 00000101 00001000 11001101
小端存储:11001101 00001000 00000101 00000000
正如我们所看到的,Little Endian 颠倒了二进制表示中的字节顺序。然而,重要的是要注意每个字节内的位顺序保持不变!

一个了解强制类型转换的有趣游戏

我最喜欢的引入类型转换的实验!

# include 
int main()

{
    int a;

    int *p;

    a=329933;

    p=&a;

    char *q;

    q=(char*)p;

    printf("%d\n",*p);

    printf("%d\n",*q);

}

输出:

329933
-51

我很好奇为什么它输出-51?

解释

  1. (char*)&a 指向 int 的第一个字节。第一个字节 11001101 被解释为字符。
  2. 最高位1表示负数,补码转换后得到-51(熟悉补码的朋友可以验证是否确实代表-51)

这是巧合吗?让我们再尝试两个例子

printf("%d\n",*(q 1));
printf("%d\n",*(q 2));

尝试一下:

  1. 尝试运行上面提到的代码并观察输出。
  2. 考虑为什么第二个和第三个字节会产生这样的输出。 欢迎在评论区讨论这个问题。
  3. 您可以将强制类型转换应用于其他数据类型吗?快来试试吧!

附加信息:补码

执行强制类型转换时,(char)p将指向四字节int的第一个字节的地址,即11001101。
最左边的1代表负号,表示是负数。应用二进制补码后,我们得到:0110011(最后 7 位)

(注:对于正数,二进制补码就是十进制数的二进制表示。对于负数,二进制补码是将除最左边(最高)位之外的所有位取反,然后加 1 得到的到最右边的位。)

将其转换为十进制得到-51。有趣吧?

补码的好处:

  1. 它允许仅使用加法器来计算正数和整数类型,从而无需减法器并简化硬件需求。
  2. 它为零提供了唯一的二进制表示形式。 10000000不代表-0,而是-128,而00000000代表0,不是0。

很多人想知道为什么是-128。如果你知道答案,欢迎在评论区分享。这不仅可以帮助别人,还可以帮助你整理思绪。

版本声明 本文转载于:https://dev.to/stockdale_roger_999e292a7/weekly-blog-four-interesting-things-i-encountered-this-week-eo9?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-04-18
  • Docker实战:通过Flask项目学习Dockerfile、容器及端口转发
    Docker实战:通过Flask项目学习Dockerfile、容器及端口转发
    本教程演示了使用Docker构建和部署一个简单的烧瓶应用程序。 我们将介绍创建一个Dockerfile,构建图像,运行容器,甚至将图像推到Docker Hub。 对于那些不熟悉Docker基础知识的人,请查看上一篇文章: [2 让我们开始一个动手示例: [2 创建一个名为“ flask-app”...
    编程 发布于2025-04-18
  • 测试Go-Chi路径变量路由:解决无法处理实体错误
    测试Go-Chi路径变量路由:解决无法处理实体错误
    用路径变量测试CHI路由:故障排除和solutions and Solutions 问题:测试使用路径变量的路由,使用httptptestest.newrequest创建了测试请求。但是,在测试期间执行Artiplect Mifdware会返回HTTP错误(不可填充的实体),表明路径变量上下文不可...
    编程 发布于2025-04-18
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-04-18
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 中,如果您使用一个大文件,并且需要从最后一行读取其内容,则在第一行到第一行,Python的内置功能可能不合适。这是解决此任务的有效解决方案:反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] ...
    编程 发布于2025-04-18
  • JavaScript计算两个日期之间天数的方法
    JavaScript计算两个日期之间天数的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    编程 发布于2025-04-18
  • 在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8 MySQL表中正确将Latin1字符转换为UTF8的方法
    在UTF8表中将latin1字符转换为utf8 ,您遇到了一个问题,其中含义的字符(例如,“jáuòiñe”)在utf8 table tabled tablesset中被extect(例如,“致电。为了解决此问题,您正在尝试使用“ mb_convert_encoding”和“ iconv”转换受...
    编程 发布于2025-04-18
  • Python元类工作原理及类创建与定制
    Python元类工作原理及类创建与定制
    python中的metaclasses是什么? Metaclasses负责在Python中创建类对象。就像类创建实例一样,元类也创建类。他们提供了对类创建过程的控制层,允许自定义类行为和属性。在Python中理解类作为对象的概念,类是描述用于创建新实例或对象的蓝图的对象。这意味着类本身是使用类关...
    编程 发布于2025-04-18
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-04-18
  • 如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    如何修复\“常规错误:2006 MySQL Server在插入数据时已经消失\”?
    How to Resolve "General error: 2006 MySQL server has gone away" While Inserting RecordsIntroduction:Inserting data into a MySQL database can...
    编程 发布于2025-04-18
  • PHP生成安全随机字母数字字符串方法
    PHP生成安全随机字母数字字符串方法
    在各种应用程序中生成随机的,唯一的字母数字字符串 ,例如帐户验证链接,对于生成数字和字母组成的唯一和随机字符串至关重要。这是您可以在PHP中实现这一目标的方法: php 7 这将产生类似的输出:bin2hex(openssl_random_pseudo_bytes($bytes))More Sec...
    编程 发布于2025-04-18
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 c...
    编程 发布于2025-04-18
  • Python与Excel动态风险更新技巧
    Python与Excel动态风险更新技巧
    [2 使用Python和Excel的动态风险更新” 在此博客中,我们将使用一个简单的Ansible Server Update脚本,并将其转变为基于风险的更新系统。在这里,风险最低的服务器首先要修补,使我们有机会在进行更高优先级系统之前进行彻底测试。 Ansible自动化: 使用Py...
    编程 发布于2025-04-18
  • Daytona助我优化开发流程
    Daytona助我优化开发流程
    作为开发人员,从事需要平稳开发环境,跨机器的一致性以及快速设置时间的项目,我被介绍给 1。简化的项目设置和依赖项 在[, node.js 的正确版本,并且所有特定于项目的依赖项都可以花费小时。 Daytona通过提供 customizable devcontainer 设置来解决此...
    编程 发布于2025-04-18
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-04-18

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3