`

判断机器存储数值用的是小端法还是大端法

    博客分类:
  • c
阅读更多

写(抄)了一段c程序,用来判断机器存储器存储数值(当然不仅数值)时候用的是小端法还是大端法。先把int或者float转换成char指针,或者unsigned char指针,然后一个一个字节的输出,其中char_with_or_not_unsigned是编译后的可执行文件名

yymt@fanhua:~$ ./char_with_or_not_unsigned 123
int:
  char pointer:          7b 00 00 00
  unsigned char pointer: 7b 00 00 00
float:
  char pointer:          00 00 fffffff6 42
  unsigned char pointer: 00 00 f6 42

 输入123时候,int值的输出是相同的,而float值不同。123的16进制表示是0x7b,这里判断出是小端法。

当输入1234的时候,有符和无符输出就都不同了(其中1234的16进制表示是0x04d2):

yymt@fanhua:~
$ ./char_with_or_not_unsigned 1234
int:
  char pointer:          ffffffd2 04 00 00
  unsigned char pointer: d2 04 00 00
float:
  char pointer:          00 40 ffffff9a 44
  unsigned char pointer: 00 40 9a 44

注意,int转型成char pointer输出的时候,第一个字节都多出一串fffff,为什么呢?

我的机子是ubuntu 11.10 server版,64位的。另,这里都是小端法表示的。

代码是:

#include<stdio.h>
typedef char* char_pointer;
typedef unsigned char* uchar_pointer;

void print_byte(char_pointer v,int len){
  for(int i = 0;i < len;i++){
    printf(" %.2x",v[i]);
  }
  printf("\n");
}
void print_ubyte(uchar_pointer v,int len){
for(int i = 0;i < len;i++){
    printf(" %.2x",v[i]);
  }
  printf("\n");
}
int main(int argc,char* argv[]){
  if(argc == 1){
    return 0;
  }
  int a = atoi(argv[1]);
  float f = (float)a;
  printf("int:\n");
  printf("  char pointer:         ");
  print_byte((char_pointer)&a,sizeof(int));
  printf("  unsigned char pointer:");
  print_ubyte((uchar_pointer)&a,sizeof(int));

  printf("float:\n");
  printf("  char pointer:         ");
  print_byte((char_pointer)&f,sizeof(float));
  printf("  unsigned char pointer:");
  print_ubyte((uchar_pointer)&f,sizeof(float));
  return 0;
}
分享到:
评论

相关推荐

    天津理工大学中加专业计算机结构实验一:数据和程序的机器级表示实验报告(附截图)

    - 目的:判断当前计算机是否采用小端法存储数据。 - 方法:定义一个联合体类型,包含一个32位整数和一个指向该整数的字节指针。设置整数为0x01020304,然后检查第一个字节是否为0x04,如果是,则表示为小端法,...

    《计算机组成与系统结构》编程实验

    1. 设计一个程序来判断机器是大端模式还是小端模式。 2. 设计一个程序来检查内存变量(如结构体或数组)是否按边界对齐。 **实验报告要求**: - 提供源程序(文本文件)和执行结果。 - 回答以下问题: - 机器是...

    16版自考02318计算机组成原理重点总结提纲有(已排版).pdf

    8. **数据存储顺序**:大端法和小端法决定了数据在内存中的存储顺序,大端法将高有效位放在低地址,小端法则反之。 9. **数码校验**:奇偶校验、海明校验和CRC码用于检测数据传输或存储中的错误。奇偶校验简单但...

    计算机专业课思维导图1

    其中,加减对阶只能右移不能左移,右移阶码增大,丢失低位尾数求和规格化:要让尾数的最高位数值位和符号位不同,直到变成00.1或11.0的形式舍入0舍1入法末尾恒置1法溢出判断规格化后根据阶码来判断是否溢出阶码为01...

    0_sample_add_huge_numbers.rar_Huge

    理解二进制表示和字节顺序(如小端序或大端序)是关键。 2. 数组表示法:大整数通常用数组来表示,数组的每个元素是大整数的一部分。可以是字节、半字、字或双字,取决于处理器架构和可用内存。 3. 运算逻辑:加法...

    《计算机组成原理》各章主要知识点1

    数据的存储格式有大端和小端模式之分,影响数据在内存中的排列顺序。此外,奇偶校验码、海明码和CRC码是常用的错误检测和纠正机制。 运算方法和运算部件中,补码运算是处理负数的关键,逻辑和算术移位会影响数值的...

    ICS复习(2019)1

    15. 最高有效字节(MSB)和最低有效字节(LSB)用于描述字节在内存中的顺序,大端方式和小端方式分别指高低位字节的存储位置。 16. C语言中数据地址通常指MSB,不同存放方式可能导致数据交换和通信时出现问题,如...

    ComputerSystems深入理解计算机系统.pdf

    例如,使用is_little_endian函数来判断系统是否采用小端字节序。 3. 信息表示和处理:文档提到了如何在计算机中表示和处理信息,涉及到了位操作和位移操作的知识。位移操作包括算术右移和逻辑右移。算术右移会保留...

    深入理解计算机系统(第二版)_家庭作业答案

    字节序通常有两种类型:小端序(little-endian)与大端序(big-endian)。在小端序系统中,数据的低位字节存储在较低的地址位置;而在大端序系统中,数据的高位字节存储在较低的地址位置。 ```c int is_little_...

    深入理解计算机系统_第二版_答案

    - **函数目的**:判断当前计算机系统是小端模式还是大端模式。 - **实现思路**: - 初始化一个整型变量`a`,并赋值为1。 - 使用类型转换将整型指针转换为字符型指针,并间接访问该整型变量的内存地址。 - 如果...

    计算机组成原理考试题型.pdf

    - 小端模式: 最低位字节存储在最低地址, 0x20000处存放0x78, 0x20001处存放0x56, 以此类推。 - 大端模式: 最高位字节存储在最低地址, 0x20000处存放0x12, 0x20001处存放0x34, 以此类推。 **5. 试述I/O设备与主机...

    深入理解计算机系统(第二版)家庭作业答案

    由于 `1` 的二进制表示为 `00000001`,如果返回值为 `1`,则表示该系统采用的是小端模式,即数值的低字节存储在内存的低地址处;反之,如果返回值不为 `1`,则系统采用大端模式,即数值的高字节存储在内存的低地址处...

Global site tag (gtag.js) - Google Analytics