大小端问题

背景

计算机系统中内存是以字节为单位进行编址的,每个地址单元都唯一的对应着1个字节(8 bit)。这可以应对char类型数据的存储要求,因为char类型长度刚好是1个字节,但是有些类型的长度是超过1个字节的(字符串虽然是多字节的,但它本质是由一个个char类型组成的类似数组的结构而已),比如C/C++中,short类型一般是2个字节,int类型一般4个字节等。因此这里就存在着一个如何安排多个字节数据中各字节存放顺序的问题。正是因为不同的安排顺序导致了大端存储模式和小端存储模式的存在。

定义

假如有一个4字节的数据为 0x12 34 56 78(十进制:305419896,0x12为高字节,0x78为低字节),若将其存放于地址 0x4000 8000中,则有:

内存地址 0x4000 8000(低地址) 0x4000 8001 0x4000 8002 0x4000 8003(高地址) 大端模式 0x12(高字节) 0x34 0x56 0x78(低字节) 小端模式 0x78(低字节) 0x56 0x34 0x12(高字节)

特点

大端模式优点: 1. 符号位在所表示的数据的内存的第一个字节中,便于快速判断数据的正负和大小

小端模式优点:
1. 内存的低地址处存放低字节,所以在强制转换数据时不需要调整字节的内容(注解:比如把int的4字节强制转换成short的2字节时,就直接把int数据存储的前两个字节给short就行,因为其前两个字节刚好就是最低的两个字节,符合转换逻辑);
2. CPU做数值运算时从内存中依顺序依次从低位到高位取数据进行运算,直到最后刷新最高位的符号位,这样的运算方式会更高效

计算机内部的数值存储

计算机中的数值存储 机器数和真值 原码、反码、补码 原码有什么问题(1+(-1)=-2) 反码有什么问题(1+(-1)=-0) 补码运算 补码表示的溢出 计算机中的数值存储 机器数和真值 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。 原码、反码、补码 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。 反码的表示方法是:正数的反码是其本身;的反码是在其原码的基础上, 符号位不变,其余各个位取反。 补码的表示方法是:正数的补码就是其本身;的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)。 原码有什么问题(1+(-1)=-2) 如果使用原码进行计算: 1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2 问题:计算错误 反码有什么问题(1+(-1)=-0) 如果使用反码进行计算: 1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0 问题:0带符号是没有任何意义的,而且会有[0000 0000]原和[1000 0000]原两个编码表示0。 [Read More]

spring boot fatjar的扫描

spring-boot-maven-plugin fat jar的结构 fat jar问题 问题:Jersey doesn’t always work with Spring Boot fat jars 发布说明:1.4版本提供了处理方法https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes 处理方式 打包 打包插件添加需要特别处理的jar包如: <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <requiresUnpack> <!--指定需要unpack的依赖--> <dependency> <groupId>com.netflix.eureka</groupId> <artifactId>eureka-core</artifactId> </dependency> <dependency> <groupId>com.netflix.eureka</groupId> <artifactId>eureka-client</artifactId> </dependency> </requiresUnpack> </configuration> </plugin> </plugins> </build> 查看插件打完的fat jar信息 spring boot 应用启动逻辑 springboot的JarLauncher继承自ExecutableArchiveLauncher,会从manifest文件中获取main-class,start-class spring boot 实现了自定义的classLoader——LaunchedURLClassLoader,以当前fat jar开始进行扫描BOOT-INF/classes/,BOOT-INF/lib/ protected Archive getNestedArchive(Archive.Entry entry) throws IOException { JarEntry jarEntry = ((JarFileEntry)entry).getJarEntry(); // 对需要unpack的jar 特殊处理 if (jarEntry.getComment().startsWith("UNPACK:")) return getUnpackedNestedArchive(jarEntry); try { JarFile jarFile = this. [Read More]

新年读书计划

| 类别 |书名 | 计划时间 | 状态 | ——– | —–: | :—-: | |软件工程 | 《编程珠玑》 | 2018.01 | |软件工程 | 《人月神话》 | 2018.02 | |系统架构 | 《高可用架构》 | 2018.01 | done |技术框架 | 《Netty权威指南》 | 2018.02 | |基础知识 | 《深入理解计算机系统》|2018.03 | |基础知识 | 《TCP/IP详解》 |2018.03 | |分布式 | 《Redis设计与实现》 |2018.04 | done |分布式 | 《Kafka技术内幕》 |2018.04 | |语言 | 《Go WEB编程》 |2018.05 | |语言 | 《Go 并发编程》 | 2018. [Read More]
阅读 

高效能人士的7个习惯

  • 主动积极
  • 以终为始
  • 要事第一
  • 双赢思维
  • 统合综效
  • 知彼解己
  • 不断更新
习惯