CPU是大小端存储的决定因素

论坛 期权论坛 脚本     
匿名技术用户   2020-12-23 04:57   172   0

之前被面试C语言经常问到如何判断系统是大端存储还是小端存储,自己想尽各种办法,又在百度上查各种奇葩方法。

最近发现大小端存储是由CPU本身架构决定的,不是由操作系统定的。像咱们平时使用的intel、AMD处理器都是小端存储(不知道人家有没有推出大端存储)。

Windows系统CPU类型定义头文件位置(以我的电脑为例):C:\Program Files (x86)\Windows Kits\8.1\Include\um\winnt.h 从15019行到15048行,原定义如下:

#define IMAGE_FILE_MACHINE_UNKNOWN           0
#define IMAGE_FILE_MACHINE_I386              0x014c  // Intel 386.
#define IMAGE_FILE_MACHINE_R3000             0x0162  // MIPS little-endian, 0x160 big-endian
#define IMAGE_FILE_MACHINE_R4000             0x0166  // MIPS little-endian
#define IMAGE_FILE_MACHINE_R10000            0x0168  // MIPS little-endian
#define IMAGE_FILE_MACHINE_WCEMIPSV2         0x0169  // MIPS little-endian WCE v2
#define IMAGE_FILE_MACHINE_ALPHA             0x0184  // Alpha_AXP
#define IMAGE_FILE_MACHINE_SH3               0x01a2  // SH3 little-endian
#define IMAGE_FILE_MACHINE_SH3DSP            0x01a3
#define IMAGE_FILE_MACHINE_SH3E              0x01a4  // SH3E little-endian
#define IMAGE_FILE_MACHINE_SH4               0x01a6  // SH4 little-endian
#define IMAGE_FILE_MACHINE_SH5               0x01a8  // SH5
#define IMAGE_FILE_MACHINE_ARM               0x01c0  // ARM Little-Endian
#define IMAGE_FILE_MACHINE_THUMB             0x01c2  // ARM Thumb/Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_ARMNT             0x01c4  // ARM Thumb-2 Little-Endian
#define IMAGE_FILE_MACHINE_AM33              0x01d3
#define IMAGE_FILE_MACHINE_POWERPC           0x01F0  // IBM PowerPC Little-Endian
#define IMAGE_FILE_MACHINE_POWERPCFP         0x01f1
#define IMAGE_FILE_MACHINE_IA64              0x0200  // Intel 64
#define IMAGE_FILE_MACHINE_MIPS16            0x0266  // MIPS
#define IMAGE_FILE_MACHINE_ALPHA64           0x0284  // ALPHA64
#define IMAGE_FILE_MACHINE_MIPSFPU           0x0366  // MIPS
#define IMAGE_FILE_MACHINE_MIPSFPU16         0x0466  // MIPS
#define IMAGE_FILE_MACHINE_AXP64             IMAGE_FILE_MACHINE_ALPHA64
#define IMAGE_FILE_MACHINE_TRICORE           0x0520  // Infineon
#define IMAGE_FILE_MACHINE_CEF               0x0CEF
#define IMAGE_FILE_MACHINE_EBC               0x0EBC  // EFI Byte Code
#define IMAGE_FILE_MACHINE_AMD64             0x8664  // AMD64 (K8)
#define IMAGE_FILE_MACHINE_M32R              0x9041  // M32R little-endian
#define IMAGE_FILE_MACHINE_CEE               0xC0EE
Linux系统CPU类型定义头文件位置(以我的电脑为例):/usr/include/elf.h 从173行到263行

源代码如下:

/* Legal values for e_machine (architecture).  */

#define EM_NONE   0  /* No machine */
#define EM_M32   1  /* AT&T WE 32100 */
#define EM_SPARC  2  /* SUN SPARC */
#define EM_386   3  /* Intel 80386 */
#define EM_68K   4  /* Motorola m68k family */
#define EM_88K   5  /* Motorola m88k family */
#define EM_860   7  /* Intel 80860 */
#define EM_MIPS   8  /* MIPS R3000 big-endian */
#define EM_S370   9  /* IBM System/370 */
#define EM_MIPS_RS3_LE 10  /* MIPS R3000 little-endian */

#define EM_PARISC 15  /* HPPA */
#define EM_VPP500 17  /* Fujitsu VPP500 */
#define EM_SPARC32PLUS 18  /* Sun's "v8plus" */
#define EM_960  19  /* Intel 80960 */
#define EM_PPC  20  /* PowerPC */
#define EM_PPC64 21  /* PowerPC 64-bit */
#define EM_S390  22  /* IBM S390 */

#define EM_V800  36  /* NEC V800 series */
#define EM_FR20  37  /* Fujitsu FR20 */
#define EM_RH32  38  /* TRW RH-32 */
#define EM_RCE  39  /* Motorola RCE */
#define EM_ARM  40  /* ARM */
#define EM_FAKE_ALPHA 41  /* Digital Alpha */
#define EM_SH  42  /* Hitachi SH */
#define EM_SPARCV9 43  /* SPARC v9 64-bit */
#define EM_TRICORE 44  /* Siemens Tricore */
#define EM_ARC  45  /* Argonaut RISC Core */
#define EM_H8_300 46  /* Hitachi H8/300 */
#define EM_H8_300H 47  /* Hitachi H8/300H */
#define EM_H8S  48  /* Hitachi H8S */
#define EM_H8_500 49  /* Hitachi H8/500 */
#define EM_IA_64 50  /* Intel Merced */
#define EM_MIPS_X 51  /* Stanford MIPS-X */
#define EM_COLDFIRE 52  /* Motorola Coldfire */
#define EM_68HC12 53  /* Motorola M68HC12 */
#define EM_MMA  54  /* Fujitsu MMA Multimedia Accelerator*/
#define EM_PCP  55  /* Siemens PCP */
#define EM_NCPU  56  /* Sony nCPU embeeded RISC */
#define EM_NDR1  57  /* Denso NDR1 microprocessor */
#define EM_STARCORE 58  /* Motorola Start*Core processor */
#define EM_ME16  59  /* Toyota ME16 processor */
#define EM_ST100 60  /* STMicroelectronic ST100 processor */
#define EM_TINYJ 61  /* Advanced Logic Corp. Tinyj emb.fam*/
#define EM_X86_64 62  /* AMD x86-64 architecture */
#define EM_PDSP  63  /* Sony DSP Processor */

#define EM_FX66  66  /* Siemens FX66 microcontroller */
#define EM_ST9PLUS 67  /* STMicroelectronics ST9+ 8/16 mc */
#define EM_ST7  68  /* STmicroelectronics ST7 8 bit mc */
#define EM_68HC16 69  /* Motorola MC68HC16 microcontroller */
#define EM_68HC11 70  /* Motorola MC68HC11 microcontroller */
#define EM_68HC08 71  /* Motorola MC68HC08 microcontroller */
#define EM_68HC05 72  /* Motorola MC68HC05 microcontroller */
#define EM_SVX  73  /* Silicon Graphics SVx */
#define EM_ST19  74  /* STMicroelectronics ST19 8 bit mc */
#define EM_VAX  75  /* Digital VAX */
#define EM_CRIS  76  /* Axis Communications 32-bit embedded processor */
#define EM_JAVELIN 77  /* Infineon Technologies 32-bit embedded processor */
#define EM_FIREPATH 78  /* Element 14 64-bit DSP Processor */
#define EM_ZSP  79  /* LSI Logic 16-bit DSP Processor */
#define EM_MMIX  80  /* Donald Knuth's educational 64-bit processor */
#define EM_HUANY 81  /* Harvard University machine-independent object files */
#define EM_PRISM 82  /* SiTera Prism */
#define EM_AVR  83  /* Atmel AVR 8-bit microcontroller */
#define EM_FR30  84  /* Fujitsu FR30 */
#define EM_D10V  85  /* Mitsubishi D10V */
#define EM_D30V  86  /* Mitsubishi D30V */
#define EM_V850  87  /* NEC v850 */
#define EM_M32R  88  /* Mitsubishi M32R */
#define EM_MN10300 89  /* Matsushita MN10300 */
#define EM_MN10200 90  /* Matsushita MN10200 */
#define EM_PJ  91  /* picoJava */
#define EM_OPENRISC 92  /* OpenRISC 32-bit embedded processor */
#define EM_ARC_A5 93  /* ARC Cores Tangent-A5 */
#define EM_XTENSA 94  /* Tensilica Xtensa Architecture */
#define EM_ALTERA_NIOS2 113  /* Altera Nios II */
#define EM_AARCH64 183  /* ARM AARCH64 */
#define EM_TILEPRO 188  /* Tilera TILEPro */
#define EM_MICROBLAZE 189  /* Xilinx MicroBlaze */
#define EM_TILEGX 191  /* Tilera TILE-Gx */
#define EM_NUM  192

/* If it is necessary to assign new unofficial EM_* values, please
   pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
   chances of collision with official or non-GNU unofficial values.  */

#define EM_ALPHA 0x9026
万恶的面试官,大小端存储是由cpu硬件定的,非要我们写个C程序获取系统的大小存储,cpu类型一看不就知道是大端存储,还是小端存储。
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP