`

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

    博客分类:
  • 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;
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics