跨平台考试

 1          将整数小段模式转化为大端模式

 小端转大端

 int  function(int  value)

 {

 char  num1,num2,num3,num4;

 int   data;

 num1 = value & 0x000000ff;

 num2 = value & 0x0000ff00;

 num3 = value & 0x00ff0000;

 num4 = value & 0xff000000;

 

 

 data = ( data | num1 ) << 2;

 data = ( data | num2 ) << 2;

 data = ( data | num3) << 2;

 data = data | num4;

 

 return  data;

 }

 有没有简便的办法可以把一个十六进制数字进行移位操作?
比如:0x672300,左移一位,变成0x723000,左移二位,变成0x230000?
右移一位,变成0x067230,右移二位,变成0x006723?


对按位与(&):100&101==100,1与1为1,0与其他(0,1)与为0
按位或(|):100|101==101,1或其他为1,0或0为0
按位异或(^):就是模二加啦。。不进位的加.。如111 xor 110==001
取反(~):就是把每位0变1,1变0 

 

 2

 test.c   --- 2个数的和

 int  add (int  a,int  b)

 {

 return   a + b;

 }

 main.cpp:

 #include "test.h"

 int  main(int  argc,char  *argv[])

 {

 int  a = 1,b = 3;

 printf("%d\n",add(a,b));

 return  0;

 }

 test.h:   ----------      C++  C混编头文件

 #ifndef  __TEST_H__

 #define  __TEST_H__

 #ifdef  __cplusplus

 extern "C"  {

 #endif

 

 

 int  add(int  a,int  b);

 #ifdef  __cplusplus

 }

 #endif

 

 

 #endif

 

 

 Makefile      --- 编写makefile 文件

 

 

 OBJ1 = test.o

 OBJ2 = main.o

 CC = gcc

 GC = g++

 

 

 CFTAS = -c

 

 

 main:

 $(GC) $(OBJ1) $(OBJ2) -o main

 test.o:test.c test.h

 $(CC) $(CFTAS) $< -o $@

 main.o:main.cpp test.h

 $(GC) $(CFTAS) $< -o $@

 clean:

 rm -f main *.o

 

 

 12,测试大小端

 bool IsBig_Endian()

 {

 unsigned short test = 0x1234;

 if(*( (unsigned char*) &test ) == 0x12)

 return TRUE;

 else

 return FALSE;

 

 }//IsBig_Endian()

 

 大小端:小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。

 大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。

 

13.

 #pragma pack(n) /* n = 1, 2, 4, 8, 16

  struct test_t

  {

    int a;

    char b;

    short c;

    char d;

  };


  #pragma pack(n)  n=0按最大对齐, n=1所有的相加(求和)即可  n=2所有是2的倍数即可


 

 14,操作系统提供的系统函数跨平台

 

 代码功能:Windows下和Linux下删除一个文件。

 #include <stdio.h>

 #if defined(WIN32) || defined(WIN64)

 #define HAVE_WINDOWS 1

 #include <windows.h>

 #endif

 

 #ifdef linux

 #define HAVE_LINUX 1

 #endif

 

 void delFile(char str[])

 {

 #ifdef HAVE_WINDOWS

 DeleteFile(str);

 printf("Del OK!\n");

 #endif

 #ifdef HAVE_LINUX

 unlink(str);

 printf("Delete OK!\n");

 #endif

 }

 

 int main()

 {

 #ifdef __GNUC__

 printf("gcc\n");

 #endif

 #ifdef __MSC_VER

 printf("vc++\n");

 #endif

 #if defined(x86) || defined(x64)

 printf("x86 or x64\n");

 #endif

 #if defined(i386) || defined(i586)

 printf("i386\n");

 #endif

 

 delFile("/tmp/1.txt");

 //getchar();

 }

 

 Linux常用的发行版本

 1.PCLinuxOS  2.Ubuntu 4.Fedora 5.Debian .6.红旗 Linux

 RISC的主要特点:

 

 (1) 选取使用频度较高的一些简单指令以及一些很有用但又不复杂的指令,让复杂指令的功能由频度高的简单指令的组合来实现。

 

 (2) 指令长度固定,指令格式种类少,寻址方式种类少。

 

 (3) 只有取数/存数指令访问存储器,其余指令的操作都在寄存器内完成。

 

 (4) CPU中有多个通用寄存器。

 

 (5) 采用流水线技术,大部分指令在一个时钟周期内完成。采用超标量和超流水线技术,可使每条指令的平均执行时间小于一个时钟周期。

 

 (6) 控制器采用组合逻辑控制,不用微程序控制。

 

 (7) 采用优化的编译程序。

 

 CISC机相比,RISC机的主要优点:

 

 (1) 充分利用VLSI芯片的面积。(2)提高计算机运算速度(3)便于设计,可降低成本,提高可靠性。(4)有效支持高级语言程序。

 

 说理论的:为何要内存对齐?

 1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。2性能原因:经过内存对齐后,CPU的内存访问速度大大提升

 CPU把内存当成是一块一块的,块的大小可以是24816字节大小,因此CPU在读取内存时是一块一块进行读取的


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值