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把内存当成是一块一块的,块的大小可以是2,4,8,16字节大小,因此CPU在读取内存时是一块一块进行读取的