在32位小端的机器

在32位小端的机器上,如下代码输出是什么:

1 char array[12] = {0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08};
2  short *pshort = (short *)array;
3  int *pint = (int *)array;
4  int64 *pint64 = (int64 *)array;
5  printf("0x%x , 0x%x , 0x%x , 0x%x", *pshort , *(pshort+2) , *pint64 , *(pint+2));

答案:

0x201 , 0x605 , 0x807060504030201 , 0x0

小端机器的数据高位字节放在高地址,低位字节放在低地址。x86结构为小端模式。

pshort占用2个字节,在内存中的16进制为0x01 0x02,对应的16进制数为0x0201。

pshort + 2指向array数组的下标为4的元素,占用2个字节,在内存中的16进制为0x05 0x06,对应的16进制数为0x0605。

pint64的int64类型不确定,但根据名字可以看出占用8个字节,对应的16进制形式为0x807060504030201。

pint  + 2占用4个字节,指向的array数组的下标为8的元素,8-11个元素没有指定数组的初始化值,默认为0,因此*(pint + 2)对应的16进制为0。

时间: 2024-10-12 00:04:05

在32位小端的机器的相关文章

假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?

1 #include <stdio.h> 2 int main(){ 3 long long a = 1, b = 2, c = 3; 4 printf("%d %d %d\n", a, b, c); 5 return 0; 6 } 1 printf()是一个库函数,C,C++中函数的参数是从右往左入栈的: 2 栈的生长方向是从高往低的 3 小端模式是低位存储在低字节 4 %d格式输出的是4个字节大小,而long long为8个字节 所以,a=1,b=0,c=2

联合体存储方式和小端机器

牛客网上有一道题 这道题知识点: http://c.biancheng.net/cpp/html/2932.html 联合体 结构体和共用体的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响:而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员.结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存.共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉. 联合体存

64位gcc编译32位汇编

由于使用as和ld来编译链接汇编程序,在使用C库的时候比较麻烦,需要输入比较多的指令,所以使用gcc进行编译链接.由于书中内容是32位汇编程序,但是机器使用的是64位操作系统,自带的gcc也是64位的,导致编译生成的程序,一运行就会Segment Fault.经过查询之后,发现是调用printf函数的时候,总是报错,查询之后发现是32位汇编和64位汇编在调用C库的时候,32位使用pushl指令来压栈传递参数,而64位汇编是使用通用寄存器来传递参数的. 32汇编的代码是: 1 .code32 2

实现大小端之间的转换宏,包括32位和64位的数

这里利用汇编的思想 思路:1.大端转换为小端模式就将大端的高位和低位的值进行交换,先将高位清零然后右移到低位,低位清零左移到高位,然后两者再进行或(|)运算,就得到小端模式  2.小端转换为大端模式就将小端的高位和低位的值进行交换,先将高位清零然后左移到高位,低位清零右移到低位,然后两者再进行或(|)运算,就得到大端模式 主要注意的是机器的位数:决定了移位数以及清零时高低位所使用的数的大小和位数 大端转换成小端模式: 32位: #define swap32Big2Little(x)    (  

我如何确定一个机器的字节顺序是大端还是小端?

通常的技巧是使用一个指针: int x = 1; if(*(char *)&x == 1) printf("little-endian\n"); else printf("big-endian\n"); 或者一个union: union { int i; char c[sizeof(int)]; } x; x.i = 1; if(x.c[0] == 1) printf("little-endian\n"); else printf(&qu

查看linux机器是32位还是64位的方法

file /sbin/init 或者 file /bin/ls/sbin/init: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped 如果显示 64-bit 则为64位: file /sbin/init/sbin/init: ELF 32-bit LSB executable, Intel 80386

[小知识]如果使用union判断机器内存是大端序存储还是小端序存储 @ C

比如int i = 1,如果是小端序存储,那么在内存中应该是这样的:0x01 0x00 0x00 0x00:如果是大端序存储的,在内存中应该是:0x00 0x00 0x00 0x01. 那么如何编程来判断机器是大端序存储呢还是小端序存储呢? 上代码: #include <stdio.h> int isBigEndian() { union { int i; char c; }test; test.c = 1; return test.i != 1; } int main() { printf(

查看linux机器是32位还是64位的相关命令

查看linux机器是32位还是64位的方法: 方法一:uname -a 方法二:uname -m 方法三: file /sbin/init   如果显示 64-bit 则为64位:如果显示为32 bit 则为32bit: 方法四:getconf LANG_BIT 方法五:ls / | grep 64   (也就是根目录如果有lib64文件夹,那就是64位) 附: 查看系统版本: cat /etc/redhat-release 查看内核版本:uname -r

【C语言】32位,64位机器sizeof区别

float, double : 采用IEEE标准浮点数格式,格式固定 float 32bit, double 64bit int一般和CPU寄存器长度有关,不过也和编译器,汇编器有关 由于C ,C++ 标准没有规定整数类型的固定长度.同一CPU不同操作系统和编译器,对于int 类型规定的长度是不同的于是为了区别这些不同,出现了数据模型这种东西.数据模型(LP32 ILP32 LP64 LLP64 ILP64 )TYPE               LP32  ILP32  LP64  ILP64