大小端定义:
大端存储模式
:是指
数据
的低字节保存在
内存
的
高地址
中,而数据的高字节保存在内存的低地址中
小端存储模式
:是指
数据
的低字节保存在
内存
的
低地址
中,而数据的高字节保存在内存的高地址中
举例:已知本机是小端存储模式,如下定义及赋值语句:
union
{
unsigned int u32;
unsigned short u16[2];
unsigned char u8[4];
}endianOrder;
// htonl是将int型整数字节序由主机字节序转为网络字节序
endianOrder.u32 = htonl(0x12345678);
endianOrder.u8[0]=?,endianOrder.u8[1]=?,endianOrder.u8[2]=?,endianOrder.u8[3]=?
endianOrder.u16[0]=?,endianOrder.u16[1]=?
程序如下
:
#include <stdio.h>
#include <arpa/inet.h>
#define TRUE 1
#define FALSE 0
int CurSystemIsLittleEndian(void)
{
unsigned int data = 1;// 1:0x00 00 00 01
unsigned char *ptr = (unsigned char *)&data;
if(*ptr == 1) return TRUE;
return FALSE;
}
int main(int argc, char *argv[])
{
// 1:首先确定当前系统是小端存储还是大端存储
if(CurSystemIsLittleEndian())
{
printf("==>当前系统存储模式是小端模式<==\n");
}
else
{
printf("==>当前系统存储模式是大端模式<==\n");
}
// 2:以union联合体分析
union
{
unsigned int u32;
unsigned short u16[2];
unsigned char u8[4];
}endianOrder;
// htonl是将int型整数字节序由主机字节序转为网络字节序
endianOrder.u32 = htonl(0x12345678);
printf("u32 addr=%p u32 value=0x%08x\n", &endianOrder.u32, endianOrder.u32);
// 打印u32对应4个字节的地址和数据
unsigned char *u8ptr = (unsigned char *)&endianOrder.u32;
printf("u32 addr [0~3][%p] [%p] [%p] [%p]\n", u8ptr, u8ptr+1, u8ptr+2, u8ptr+3);
printf("u32 value [0~3][%x] [%x] [%x] [%x]\n", *u8ptr, *(u8ptr+1), *(u8ptr+2),*(u8ptr+3));
// 打印u16
unsigned short *u16ptr = (unsigned short *)&endianOrder.u32;
printf("u16 addr [0~1][%p] [%p]\n", u16ptr, u16ptr+1);
printf("u16 value [0~1][%x] [%x]\n", *u16ptr, *(u16ptr+1));
printf("u8 value[0~3][%x][%x][%x][%x]\n", endianOrder.u8[0],endianOrder.u8[1],endianOrder.u8[2],endianOrder.u8[3]);
return 0;
}
运行结果:
==>当前系统存储模式是小端模式<==
u32 addr=0x7fff17185e80 u32 value=0x78563412
u32 addr [0~3][0x7fff17185e80] [0x7fff17185e81] [0x7fff17185e82] [0x7fff17185e83]
u32 value [0~3][12] [34] [56] [78]
u16 addr [0~1][0x7fff17185e80] [0x7fff17185e82]
u16 value [0~1][3412] [7856]
u8 value[0~3][12][34][56][78]
大小端定义:大端存储模式:是指数据的低字节保存在内存的高地址中,而数据的高字节保存在内存的低地址中小端存储模式:是指数据的低字节保存在内存的低地址中,而数据的高字节保存在内存的高地址中举例:已知本机是小端存储模式,如下定义及赋值语句:union{unsigned int u32;unsigned short u16[2];unsigned char u8[4];}endianOrder;// htonl是将int型整数字节序由主机...
计算机
硬件有两种储存数据的方式:
大端
字节序
(big endian)和
小端
字节序
(little endian)。
举例来说,数值0x2211使用两个
字节
储存:高位
字节
是0x22,低位
字节
是0x11。
大端
字节序
:高位
字节
在前,低位
字节
在后
小端
字节序
:低位
字节
在前,高位
字节
在后,即以0x1122形式储存。
怎么去记才不会出错呢?
其实只需要记住
小端
是低位
字节
存低位数据,高位
字节
存高位数据。(称为:低低高高)
同理:0x1234...
#include <string.h>
typedef unsigned char u
int
8_t;
typedef unsigned short u
int
16_t;
typedef unsigned
int
u
int
32_t;
void u8_to_u32(unsigned char* u8,unsigned
int
*u3...
网络
字节
顺
序
与本地
字节
顺
序
之间的转换函数:
htonl
()--"Host to Network Long"
ntohl()--"Network to Host Long"
htons()--"Host to Network Short"
ntohs()--"Network to Host Short"
之所以需...
在Linux和Windows
网络
编程时需要用到htons和
htonl
函数,用来将
主机
字节
顺
序
转换为
网络
字节
顺
序
。
在
Int
el机器下,执行以下程
序
int
main()
pr
int
f("%...
文章目录1.
计算机
组成2.指令如何被执行1.1相关术语1.2程
序
1.3流程
1.
计算机
组成
当前
计算机
的组成最早是由冯诺依曼提出的"冯诺依曼体系结构",由控制器、运算器、存储器、输入设备、输出设备五部分组成,控制器是整个
计算机
的核心,对指令进行解释及控制。运算器的功能是对数据进行算数运算和逻辑运算。存储器存放程
序
及数据。输入是
计算机
采集外部信息的方式,而输出是将内部的信息显示出来。
2.指令如何被执行
指令的执行经过三个阶段,取指、译码、执行,以下面程
序
为例子,截取部分片段,介绍指令的执行情况(c
PUBLIC DESCRIPTOR gdt[GDT_SIZE];
PUBLIC void* memcpy(void* pDst, void* pSrc,
int
iSize);
然后看memcpy(&gdt,(void*)(*(