在计算机系统中,咱们是以字节为单位的,每一个地址单元都对应着一个字节,一个字节为 8bit。函数
#include<stdio.h> static int stack_dir; static void find_stack_direction (void) { static char *addr = NULL; char dummy; if (addr == NULL) { addr = &dummy; find_stack_direction (); } else { if (&dummy > addr) stack_dir = 1; else stack_dir = -1; } } int main(void) { find_stack_direction(); if(stack_dir==1) puts("stack grew upward"); else puts("stack grew downward"); return 0; }
find_stack_direction函数使用函数递归的方法,第一次进入,因为addr为NULL,因此将字符变量dummy的地址赋值给静态变量addr,第二次进入,因为静态变量addr已赋了值,因此进入 "Second entry." 接着,将第二次进入的dummy地址和第一次进入的dummy地址相比较,若是值为正,则堆栈向高地址增加;不然,堆栈向低地址增加。pwa
为何会有大小端模式之分呢?这是由于在计算机系统中,咱们是以字节为单位的,每一个地址单元都对应着一个字节,一个字节为 8bit。可是在C语言中除了8bit的char以外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,因为寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。所以就致使了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,恰好相反。咱们经常使用的X86结构是小端模式,而KEIL C51则为大端模式。不少的ARM,DSP都为小端模式。有些ARM处理器还能够由硬件来选择是大端模式仍是小端模式。指针
int i=1; char *p=(char *)&i; if(*p==1) printf("Little_endian"); //Little_endian else printf("Big_endian"); //Big_endian
// 若处理器是Big_endian的,则返回0;如果Little_endian的,则返回1 int Check_CPU( ) { union w { int a; char b; } c; c.a = 1; return(c.b ==1); }
联合体union的存放顺序是全部成员都从低地址开始存放
为何会有大小端模式之分呢?这是由于在计算机系统中,咱们是以字节为单位的,每一个地址单元都对应着一个字节,一个字节为 8bit。可是在C语言中除了8bit的char以外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,因为寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。所以就致使了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,恰好相反。咱们经常使用的X86结构是小端模式,而KEIL C51则为大端模式。不少的ARM,DSP都为小端模式。有些ARM处理器还能够由硬件来选择是大端模式仍是小端模式。code
博客blog