在现代计算机中表示和操作信息 - 第 2 部分
第 1 部分的链接
寻址和字节顺序
32 位机器中的 4 字节 int 将其所有 4 个字节存储在连续的字节序列中。根据机器的不同,它可以以两种方式存储,即小端和大端。不详细讨论Little endian存储一个十六进制值0x01234567的int(32位为4字节),如下所示(假设起始地址为0x100):
地址/值
0x100 67
0x101 45
0x102 23
0x103 01
类似地,大端字节序将如下所示:
地址/值
0x100 01
0x101 23
0x102 45
0x103 67
我希望您能看到顺序上的差异。 Linux 32 位、Windows、Linux 64 位遵循 Little endian,而 SunOS/SPARC 遵循 Big endian。
这很重要,因为通过网络从 Little endian 字节排序机向 Big endian 字节排序机发送消息时可能会出现问题,反之亦然。大多数程序员并不认为这是一个问题,因为网络应用程序的编写方式可以为我们进行此转换,但如果您正在编写网络应用程序,则可能需要考虑这一点。
整数算术
您可能会惊讶地发现,两个正数相加会得到负数,并且 x
让我举个例子,假设我们有一台计算机将 int 存储为 4 位,并且我们有两个 无符号 int x 和 y。
无符号整数 x = 10; // 二进制表示:1010
无符号整型 y = 15; // 二进制表示:1111
无符号整数 z = x y; // ???
z 的值为 25,对吗?对吗?
嗯,不。如果将 25 转换为其二进制表示形式,则结果为 11001,但正如我提到的,我们的计算机只能存储 4 位整数(无符号情况下的值从 0 到 15)。那么,我们的计算机将如何处理额外的 1 位呢?你是对的,它会丢弃高位(左起第一位),我们将得到 1001,它转换为 9。这与使用 16 进行模块相同,即 25 mod 16=9。计算机的这种不限于算术的行为也称为溢出。
但是为什么我在这里使用 unsigned int 呢?对于有符号整数,此加法的行为是否会有所不同?
答案:是的,但在解释结果是什么以及我们的计算机如何最终得到这个结果之前,让我们首先了解一下我们的 4 位大小整数有符号和无符号有何不同。
有符号整数
它们可以存储从-8(bin代表:1000)到7(bin代表:0111)的正负两个数字值。高阶位(左起第一位)给出有符号整数负值,其余位给出正值。因此,要获得最小的数字,我们需要将高位翻转为 1,其他位翻转为 0;要获得最大的数字,我们需要将高位翻转为 0,其他位翻转为 1。
无符号整数
它们只能存储从 0(二进制表示:0000)到 15(二进制表示:1111)的正数值。
现在,因为 x=10 和 y=15 在相加之前会溢出,所以我们将使用更小的值:
整数x = 5; // 0101
整数y=6; // 0110
int z = x y // ???
如果我们忽略带符号的考虑,二进制表示应该是 1011。正如你所看到的,高位被翻转为 1,从上面看,z 的值将是 -5(= -1*2ˆ3 2ˆ1 2ˆ0) 而不是 11。
而且,添加两个负数可能会导致结果。例如,
int x = -8 // 1000
int y = -5 // 0101
int z = x y // ???
现在 z 将为 -13,即二进制的 10011(高阶位用于负数,即 -1*2ˆ4 = -16),但我们的计算机只能存储 4 位,因此它将丢弃高阶位,变为0011,即十进制3。再次溢出。
这就是为什么 x
这就是今天的全部内容。如果这里的某些信息是错误或缺失的,请评论。谢谢。
以上是在现代计算机中表示和操作信息 - 第 2 部分的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

C#和C 的历史与演变各有特色,未来前景也不同。1.C 由BjarneStroustrup在1983年发明,旨在将面向对象编程引入C语言,其演变历程包括多次标准化,如C 11引入auto关键字和lambda表达式,C 20引入概念和协程,未来将专注于性能和系统级编程。2.C#由微软在2000年发布,结合C 和Java的优点,其演变注重简洁性和生产力,如C#2.0引入泛型,C#5.0引入异步编程,未来将专注于开发者的生产力和云计算。

C 学习者和开发者可以从StackOverflow、Reddit的r/cpp社区、Coursera和edX的课程、GitHub上的开源项目、专业咨询服务以及CppCon等会议中获得资源和支持。1.StackOverflow提供技术问题的解答;2.Reddit的r/cpp社区分享最新资讯;3.Coursera和edX提供正式的C 课程;4.GitHub上的开源项目如LLVM和Boost提升技能;5.专业咨询服务如JetBrains和Perforce提供技术支持;6.CppCon等会议有助于职业

C#和C 的学习曲线和开发者体验有显着差异。 1)C#的学习曲线较平缓,适合快速开发和企业级应用。 2)C 的学习曲线较陡峭,适用于高性能和低级控制的场景。

C 通过第三方库(如TinyXML、Pugixml、Xerces-C )与XML交互。1)使用库解析XML文件,将其转换为C 可处理的数据结构。2)生成XML时,将C 数据结构转换为XML格式。3)在实际应用中,XML常用于配置文件和数据交换,提升开发效率。

静态分析在C 中的应用主要包括发现内存管理问题、检查代码逻辑错误和提高代码安全性。1)静态分析可以识别内存泄漏、双重释放和未初始化指针等问题。2)它能检测未使用变量、死代码和逻辑矛盾。3)静态分析工具如Coverity能发现缓冲区溢出、整数溢出和不安全API调用,提升代码安全性。

使用C 中的chrono库可以让你更加精确地控制时间和时间间隔,让我们来探讨一下这个库的魅力所在吧。C 的chrono库是标准库的一部分,它提供了一种现代化的方式来处理时间和时间间隔。对于那些曾经饱受time.h和ctime折磨的程序员来说,chrono无疑是一个福音。它不仅提高了代码的可读性和可维护性,还提供了更高的精度和灵活性。让我们从基础开始,chrono库主要包括以下几个关键组件:std::chrono::system_clock:表示系统时钟,用于获取当前时间。std::chron

C 在现代编程中仍然具有重要相关性。1)高性能和硬件直接操作能力使其在游戏开发、嵌入式系统和高性能计算等领域占据首选地位。2)丰富的编程范式和现代特性如智能指针和模板编程增强了其灵活性和效率,尽管学习曲线陡峭,但其强大功能使其在今天的编程生态中依然重要。

C 的未来将专注于并行计算、安全性、模块化和AI/机器学习领域:1)并行计算将通过协程等特性得到增强;2)安全性将通过更严格的类型检查和内存管理机制提升;3)模块化将简化代码组织和编译;4)AI和机器学习将促使C 适应新需求,如数值计算和GPU编程支持。
