从两道经典试题谈C/C++中联合体(union)的使用
从两道经典试题谈C/C++中联合体(union)的使用
试题一:编写一段程序判断系统中的CPU是Little endian还是Big endian模式?
分析:
作为一个计算机相关专业的人,我们应该在计算机组成中都学习过什么叫Little endian和Big endian。Little endian和Big endian是CPU存放数据的两种不同顺序。对于整型、长整型等数据类型,Big endian认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而Little endian则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。
例如,假设从内存地址0x0000开始有以下数据:
0x0000
0x0001
0x0002
0x0003
0x12
0x34
0xab
0xcd
如果我们去读取一个地址为0x0000的四个字节变量,若字节序为big-endian,则读出结果为0x1234abcd;若字节序位little-endian,则读出结果为0xcdab3412。如果我们将0x1234abcd写入到以0x0000开始的内存中,则Little endian和Big endian模式的存放结果如下:
地址
0x0000
0x0001
0x0002
0x0003
big-endian
0x12
0x34
0xab
0xcd
little-endian
0xcd
0xab
0x34
0x12
一般来说,x86系列CPU都是little-endian的字节序,PowerPC通常是Big endian,还有的CPU能通过跳线来设置CPU工作于Little endian还是Big endian模式。
解答:
显然,解答这个问题的方法只能是将一个字节(CHAR/BYTE类型)的数据和一个整型数据存放于同样的内存开始地址,通过读取整型数据,分析CHAR/BYTE数据在整型数据的高位还是低位来判断CPU工作于Little endian还是Big endian模式。得出如下的答案:
typedef unsigned char BYTE;
int main(int argc, char* argv[])
{
unsigned int num,*p;
p = #
num = 0;
*(BYTE *)p = 0xff;
if(num == 0xff)
{
printf("The endian of cpu is little\n");
}
else &nbs
相关文档:
项目中要用到一个模块。看了下该模块的用法,就依葫芦画瓢的搬到自己的代码里面来了。不过在编译的时候碰到了麻烦, 在程序链接的时候出错:“undefined reference to***",应该是因为没有包含相应的库文件吧。
于是比较了make file文件的写法,试图在我这边 ......
wchar_t wsWorkingDir[256] = _T("");
CString strPDF(_T(""));
::GetCurrentDirectory(256, wsWorkingDir);
strPDF.Format(_T("%s"), wsWorkingDir);
if (strPDF.GetAt(strPDF.GetLength()-1) != '\\')
{
strPDF += '\\';
}
strPDF += "doc\\my.pdf" ......
4*4键盘扫描C程序
#include<reg52.h>
#define uchar unsigned char
uchar code table[]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90,
0x88,0x83,0xC6,0xA1,0x86,0x8E};
uchar temp,num;
void display(uchar);
void delay(uchar a)
{
......
我一直想做一个软件出来,只是简单的,比如说一个加减乘除的EXE。可是我知道我错了,我最近选修了一门电子工程设计与制作后才了解编程的目的和工具的多样性。不同的软件提供不同的编译环境,我发现模拟软件的强的。我时常想我是不是可以通过我下载安装的软件来学习些源程序。是的有一些,可是完全看不懂,除了 ......
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <malloc.h>
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main()
{
char a = 'a';
......