首页  >  文章  >  web前端  >  每周博客:本周我遇到的四件有趣的事情

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

王林
王林原创
2024-09-08 20:35:03694浏览

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 317e6b6395ab75e70e7f0880af8f6835
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。如果你知道答案,欢迎在评论区分享。这不仅可以帮助别人,还可以帮助你整理思绪。

以上是每周博客:本周我遇到的四件有趣的事情的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn