判断机器储存数值用的是小端法还是大端法
判断机器存储数值用的是小端法还是大端法
写(抄)了一段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; }