建设网站要备案吗,区块链 网站 怎么做,网站建设一般用什么语言好,财务软件有哪些一.整型在内存中的存储 在讲解操作符的时候#xff0c;我们就讲过了下面的内容#xff1a; 整数的2进制表示方法有三种#xff0c;即 原码、反码和补码 有符号的整数#xff0c;三种表示方法均有符号位和数值位两部分#xff0c;符号位都是用0表示正#xff…
一.整型在内存中的存储 在讲解操作符的时候我们就讲过了下面的内容 整数的2进制表示方法有三种即 原码、反码和补码 有符号的整数三种表示方法均有符号位和数值位两部分符号位都是用0表示正用1表示负最高位的一位是被当做符号位剩余的都是数值位。 正整数的原、反、补码都相同。 负整数的三种表示方法各不相同。 TH 原码直接将数值按照正负数的形式翻译成二进制得到的就是原码。 反码将原码的符号位不变其他位依次按位取反就可以得到反码。 补码反码1就得到补码。 对于整形来说数据存放内存中其实存放的是二进制的补码。 为什么呢 在计算机系统中数值一律用补码来表示和存储。 原因在于使用补码可以将符号位和数值域统一处理 同时加法和减法也可以统一处理 (CPU只有加法器此外补码与原码相互转换其运算过程是相同的不需要额外的硬件电路。 二.大小端字节序和字节序判断 我们以一个字节为单位调整了位置顺序我们发现这个数字是倒着存放的这是为什么呢我们先来了解什么是大小端。 1.什么是大小端 其实超过一个字节的数据在内存中存储的时候就有存储顺序的问题按照不同的存储顺序我们分为大端字节序存储和小端字节序存储下面是具体的概念 大端存储模式 是指数据的低位字节内容保存在内存的高地址处而数据的高位字节内容保存在内存的低地址处。 小端存储模式 是指数据的低位字节内容保存在内存的低地址处而数据的高位字节内容保存在内存的高地址处。上述概念需要记住方便分辨大小端。 看图
我们这样用16进制形式来进行方便展示实际上在内存中数据是以二进制存储的。从上面我们的运行结果来看在我们当前的机器上是小端存放的。 2.为什么有大小端 为什么会有大小端模式之分呢 这是因为在计算机系统中我们是以字节为单位的每个地址单元都对应着一个字节一个字节为8 bit位但是在C语言中除了8 bit的char之外还有16 bit的short型32 bit 的long型要看具体的编译器另外对于位数大于8位的处理器例如16位或者32位的处理器由于寄存器宽度大于一个字节那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。 例如一个 16bit 的short型x在内存中的地址为0x0010,x的值为0x1122那么0x11为高字节0x22为低字节。对于大端模式就将0x11放在低地址中即0x0010中0x22放在高地址中即0x0011中。小端模式刚好相反。我们常用的X86结构是小端模式而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。 我们来进行几个练习。 练习1请简述大端字节序和小端字节序的概念设计一个小程序来判断当前机器的字节序。 我们先来画图分析看一下 结果 所以我们当前所用机器的字节序为小端字节序。 练习2 请看题 分析 char只能存放8个比特位所以它找8个比特位放进a中11111111这就是截断就是我们4个字节的数据非得放到1个字节中要发生截断我只保留它最低位那个字节的数据剩下的我不要了。 所以b和c也是如此放入数据里面放的也是11111111。但是存进去的值表示多少还得看我们的类型当我们存放的是相同的二进制序列的时候要看类型怎么看待它的这是非常重要的。 我们是用%d格式进行打印所以a,b,c 要发生整型提升。 打印结果 站在存储的角度它们a,b,c存放的是一样的值当我们用它的时候这就跟它的类型有关系了。
类型的作用1.申请内存空间时的大小 2.类型决定了看待内存中数据的视角。 练习3 %u打印无符号的整数所以a也要发生整型提升因为a类型是char,所以高位就是符号位当对a发生整型提升时把a的高位全部补1。 这是我们提升完得到的补码但是我们用%u形式打印的是无符号的整数无符号整数是没有原反补的概念用%u形式打印的时候认为内存中存的是无符号数。认为我们刚刚得到的补码是无符号数的补码。没有符号位无符号整数的原码反码补码是相同的。所以当我们提升完得到的补码就是它的原码。 结果 当以%d形式打印的时候我们得到补码之后还要得到它的原码所以答案就是-128。 与它相似的题目看看这个自己能不能推算出来结果。 练习4 因为char类型取值范围-128到127虽然存放的值是-1到-1000它肯定要发生一些变化。 strlen是求字符串长度的这里就得关注\0的问题其实就是找到数字为0的地方因为它的ASCII为0那我们怎么样才能遇到零呢 看画好的图分析一下 无符号的char无符号位每一位都是有效位。 当最后11111111加一变成100000000前面那个看不见了因为char类型只能接受8个比特位所以就变成了00000000为零。 结果 练习5 这个答案形成死循环关于使用无符号变量的时候要小心你给出的条件会不会形成死循环。
下一道 当i减到-1的时候不会是-1因为当把-1放到unsigned int 变量里面上去-1的补码是全1全都是有效位当成全1被当成无符号数处理的时候是一个非常大的整数无符号整数类型变量放的值不可能小于零所以形成死循环。-1被当成无符号数处理。 使用无符号整数变量的时候大于等于零恒成立小于某一个数的时候也可能形成死循环。 练习6 分析%x是16进制的形式打印来看图 我们使用不同的打印格式来看打印结果。 欧克上篇结束如果对你有用的话请留下你的赞赞吧