1 前言我们知道在操作符中与2进制有关的操作符:& | ^ ~ >> 使用这些操作符就离不开整数
1. 前言
我们知道在操作符中与2进制有关的操作符:& | ^ ~ >>
使用这些操作符就离不开整数中在内存中的存储。 我们一起来看看整数的存储。
2. 整数在内存中的存储整数存储: 整数的二进制表示方法有三种:原码、反码和补码。 三种表示法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位最高位的⼀位是被当做符号位,剩余的都是数值位。
而正整数的原、反、补码都相同。 负整数的三种表示方法各不相同。 原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。 补码:反码+1就得到补码。
负数原反补之间转换就用下面这个图来表示:
立即学习“C语言免费学习笔记(深入)”;
这是因为在计算机系统中,数值⼀律用补码来表示和存储。而在于,使用补码,可以将符号位和数值域统⼀处理; 同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
3. 大小端字节序和字节序判断当一个数值超过1个字节的时候,存储在内存中有存储的顺序问题,而内存的储存单元是1字节。
3.1 什么是大小端字节序大端的字节序:将一个数值的最低位字节的内容存储到高位地址,高位字节序的内容存储到低地址处。 小端的字节序:将一个数值的最低位字节的内容存储到低位地址,高位字节序的内容存储到高地址处。
就像一个三位数从右往左就是个,十,百,也就是从低到高。
举个例子: int a = 0x 11 22 33 44; 大端就是把低地址位依次从高地址位置放置
小端就是把低地址位依次从低地址位置放置
为什么会有大小端模式之分呢? 这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为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处理器还可以由硬件来选择是大端模式还是小端模式。
3.3 写程序来判断当前机器的字节序设计⼀个程序来判断当前机器的字节序,在大厂的笔试中就有这道题目。 那我们该怎么写呢? 假设给了一个int a = 1; 它在内存中存储为 0x 00 00 00 01,如果我们只取01,知道它在高字节中就是大端,在低字节就是小端。 那我们就将整数1的地址强制转化为char类型,来判断是否等于1。等于1是就是小端,等于0就是大端。
代码语言:javascript代码运行次数:0运行复制#define _CRT_SECURE_NO_WARNINGS 1#include登录后复制#include #include int check_sys(){int a = 1;if ((*(char*)&a) == 1){return 1;//小端}else{return 0;//大端}}int main(){if (check_sys() == 1){printf("小端\n");}else{printf("大端\n");}return 0;}
菜鸟下载发布此文仅为传递信息,不代表菜鸟下载认同其观点或证实其描述。
版权投诉请发邮件到 cn486com#outlook.com (把#改成@),我们会尽快处理
Copyright © 2019-2020 菜鸟下载(www.cn486.com).All Reserved | 备案号:湘ICP备2022003375号-1
本站资源均收集整理于互联网,其著作权归原作者所有,如有侵犯你的版权,请来信告知,我们将及时下架删除相应资源