Lesson-12.md

January 17, 2013 · View on GitHub

Lesson 12 Does your machine use little-endian? 判断机器存储是否小尾端

#include <stdio.h>

union u_tag 
{
	unsigned char c[4];
	int i;
	double d;
} u;

#define printc( expr )	printf( #expr " = %c \n", expr )
#define printi( expr )	printf( #expr " = %d \n", expr )
#define printd( expr )	printf( #expr " = %f \n", expr )
#define printx( expr )	printf( #expr " = %x \n", expr )

int main( int argc, char * argv[] )
{
	printf( "hello, Cruel World! \n" );

	printf( "sizeof u_tag = %d \n", sizeof(u) );
	printf( "sizeof double = %d \n", sizeof(double) );

	u.c[0] = '0';
	printf( "u.c[0] = %c \n", u.c[0] );
	printi( u.c[0] );
	printi( u.c[1] );
	printi( u.c[2] );
	printi( u.c[3] );
	printi( u.i );
	printd( u.d );
	
	u.i = 0x12345678;
	printf( "u.c[0] = %c \n", u.c[0] );
	printx( u.c[0] );
	printx( u.c[1] );
	printx( u.c[2] );
	printx( u.c[3] );
	printx( u.i );
	printd( u.d );

	return 0;
}

知识点

  • 联合 union
  • 字符数组类型 char buf[4]
  • 存储格式 big/little endian
  • 浮点数格式 (1.00 的存储方式 0x3f800000)

课堂讨论

  • 联合中能够包含结构体吗? 结构体中能够包含联合吗?
  • 列举出三种能够使用联合的场合。

课后练习

  • 请用联合定义一个 XModem 协议包。