zoukankan      html  css  js  c++  java
  • 论C/C++数据在内存中的二进制存放形式

    版权声明:本文为博主原创文章,未经博主同意不得转载。 https://blog.csdn.net/u010518429/article/details/30332237
    // enter any type data to show Binary.c
    // 输入指定类型数据显示其二进制值
    // version: 6.0
    // 缺陷: 请勿使用vc 6.0编译 由于不支持long long及unsigned long long类型
    
    #define _CRT_SECURE_NO_WARNINGS // Microsoft Visual Studio 2013编译器请加入本行
    #include <stdio.h>
    #include <limits.h> // CHAR_BIT所属h文件 CHAR_BIT = 8
    #define MAX	13 // 最大选项数
    #define EATLINE while (getchar() != '
    ') continue // 应输入数字但实际输入字母则剔除错误输入
    #define SHOW_INPUT(str) printf("Please input a %s number ", str) // 显示请输入语句
    #define SHOW_ERROR(str)	printf("wrong %s number!
    ", str) // 显示输入错误语句
    
    const char * const datatype[MAX + 1] =
    {
    	"exit",
    	"char",
    	"unsigned char",
    	"short",
    	"unsigned short",
    	"int",
    	"unsigned int",
    	"long",
    	"unsigned long",
    	"long long",
    	"unsigned long long",
    	"float",
    	"double",
    	"long double"
    };
    
    int menu(void);
    void convert(const unsigned char * const ch, const char size);
    
    int main(void)
    {
    	union
    	{
    		long long llvalue;
    		unsigned long long ullvalue;
    		float fvalue;
    		double dvalue;
    		long double ldvalue;
    		// 用unsigned类型是为了与mask类型一致
    		unsigned char array[CHAR_BIT];
    	}data;
    
    	int select; // 选项
    
    	// while ((select = menu()) != 0)
    	while (select = menu())
    	{
    		switch (select)
    		{
    		case 1: // char
    			SHOW_INPUT(datatype[select]);
    			printf("(%d to %d) : ", CHAR_MIN, CHAR_MAX);
    			while (scanf("%lld", &data.llvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    				printf("(%d to %d) : ", CHAR_MIN, CHAR_MAX);
    			}
    			printf("
    %lld is in %#p
    Binary : ", data.llvalue, &data.llvalue);
    			convert(data.array, sizeof(char));
    			break;
    
    		case 2:	// unsigned char
    			SHOW_INPUT(datatype[select]);
    			printf("(0 to %u) : ", UCHAR_MAX);
    			while (scanf("%llu", &data.ullvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    				printf("(0 to %u) : ", UCHAR_MAX);
    			}
    			printf("
    %llu is in %#p
    Binary : ", data.ullvalue, &data.ullvalue);
    			convert(data.array, sizeof(unsigned char));
    			break;
    
    		case 3: // short
    			SHOW_INPUT(datatype[select]);
    			printf("(%d to %d) : ", SHRT_MIN, SHRT_MAX);
    			while (scanf("%lld", &data.llvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    				printf("(%d to %d) : ", SHRT_MIN, SHRT_MAX);
    			}
    			printf("
    %lld is in %#p
    Binary : ", data.llvalue, &data.llvalue);
    			convert(data.array, sizeof(short));
    			break;
    
    		case 4:	// unsigned short
    			SHOW_INPUT(datatype[select]);
    			printf("(0 to %u) : ", USHRT_MAX);
    			while (scanf("%llu", &data.ullvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    				printf("(0 to %u) : ", USHRT_MAX);
    			}
    			printf("
    %llu is in %#p
    Binary : ", data.ullvalue, &data.ullvalue);
    			convert(data.array, sizeof(unsigned short));
    			break;
    
    		case 5: // int
    			SHOW_INPUT(datatype[select]);
    			printf("(%d to %d) : ", INT_MIN, INT_MAX);
    			while (scanf("%lld", &data.llvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    				printf("(%d to %d) : ", INT_MIN, INT_MAX);
    			}
    			printf("
    %lld is in %#p
    Binary : ", data.llvalue, &data.llvalue);
    			convert(data.array, sizeof(int));
    			break;
    
    		case 6: // unsigned int
    			SHOW_INPUT(datatype[select]);
    			printf("(0 to %u) : ", UINT_MAX);
    			while (scanf("%llu", &data.ullvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    				printf("(0 to %u) : ", UINT_MAX);
    			}
    			printf("
    %llu is in %#p
    Binary : ", data.ullvalue, &data.ullvalue);
    			convert(data.array, sizeof(unsigned int));
    			break;
    
    		case 7: // long
    			SHOW_INPUT(datatype[select]);
    			printf("(%d to %d) : ", LONG_MIN, LONG_MAX);
    			while (scanf("%llu", &data.ullvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    				printf("(%d to %d) : ", LONG_MIN, LONG_MAX);
    			}
    			printf("
    %llu is in %#p
    Binary : ", data.ullvalue, &data.ullvalue);
    			convert(data.array, sizeof(long));
    			break;
    
    		case 8: // unsigned long
    			SHOW_INPUT(datatype[select]);
    			printf("(0 to %u) : ", ULONG_MAX);
    			while (scanf("%llu", &data.ullvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    				printf("(0 to %u) : ", ULONG_MAX);
    			}
    			printf("
    %llu is in %#p
    Binary : ", data.ullvalue, &data.ullvalue);
    			convert(data.array, sizeof(unsigned long));
    			break;
    
    		case 9: // long long
    			SHOW_INPUT(datatype[select]);
    			printf("(%lld to %lld) : ", LLONG_MIN, LLONG_MAX);
    			while (scanf("%lld", &data.llvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    				printf("(%lld to %lld) : ", LLONG_MIN, LLONG_MAX);
    			}
    			printf("
    %lld is in %#p
    Binary : ", data.llvalue, &data.llvalue);
    			convert(data.array, sizeof(long long));
    			break;
    
    		case 10: // unsigned long long
    			SHOW_INPUT(datatype[select]);
    			printf("(0 to %llu) : ", ULLONG_MAX);
    			while (scanf("%llu", &data.ullvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    				printf("(0 to %llu) : ", ULLONG_MAX);
    			}
    			printf("
    %llu is in %#p
    Binary : ", data.ullvalue, &data.ullvalue);
    			convert(data.array, sizeof(unsigned long long));
    			break;
    
    		case 11: // float
    			SHOW_INPUT(datatype[select]);
    			printf(": ");
    			while (scanf("%f", &data.fvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    			}
    			printf("
    %f is in %#p
    Binary : ", data.fvalue, &data.fvalue);
    			convert(data.array, sizeof(float));
    			break;
    
    		case 12: // double
    			SHOW_INPUT(datatype[select]);
    			printf(": ");
    			while (scanf("%lf", &data.dvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    			}
    			printf("
    %lf is in %#p
    Binary : ", data.dvalue, &data.dvalue);
    			convert(data.array, sizeof(double));
    			break;
    
    		case 13: // long double
    			SHOW_INPUT(datatype[select]);
    			printf(": ");
    			while (scanf("%lf", &data.ldvalue) != 1)
    			{
    				EATLINE;
    				SHOW_ERROR(datatype[select]);
    				SHOW_INPUT(datatype[select]);
    			}
    			printf("
    %lf is in %#p
    Binary : ", data.ldvalue, &data.ldvalue);
    			convert(data.array, sizeof(long double));
    			break;
    
    		default:
    			break;
    		}
    	}
    	printf("Bye.
    ");
    	getch();
    	return 0;
    }
    
    int menu(void)
    {
    	int i, code, status;
    
    	for(i = 0; i <= MAX; ++i)
    		printf("%d	%s
    ",i , datatype[i]);
    
    	printf("Please input the number to select : ");
    	while ((status = scanf("%d", &code)) != 1 || (code > MAX || code < 0))
    	{
    		if (status != 1)
    			scanf("%*s");
    		printf("input an integer from 0 to %d,please
    ", MAX);
    	}
    	return code;
    }
    
    void convert(const unsigned char * const ch, const char size)
    {
    	char i;
    	for (i = size - 1; i >= 0; --i)
    	{
    		// 掩码mask用unsigned类型是为了无符号数右移以0填充
      		unsigned char j, mask = 1 << (CHAR_BIT - 1); // 0x80 即 1000 0000B
    		for (j = 0; j < CHAR_BIT; ++j)
    		{
    			(ch[i] & mask) == mask ? putchar('1') : putchar('0');
    			// mask = mask >> 1;
    			mask >>= 1; // 右移1位
    			// 每输出8位2进制就空一格
    			if (j % CHAR_BIT == CHAR_BIT -1)
    				putchar(' ');
    		}
    	}
    
    	printf("
    
    ");
    
    	for (i = 0; i < size; ++i)
    	{
    		printf("%#p : 	", ch + i);
    		unsigned char j, mask = 1 << (CHAR_BIT - 1); // 0x80 即 1000 0000B
    		for (j = 0; j < CHAR_BIT; ++j)
    		{
    			(ch[i] & mask) == mask ? putchar('1') : putchar('0');
    			// mask = mask >> 1;
    			mask >>= 1; // 右移1位
    			// 每输出8位2进制就空一格
    			if (j % CHAR_BIT == CHAR_BIT - 1)
    				putchar(' ');
    		}
    		putchar('
    ');
    	}
    	putchar('
    ');
    }
    

  • 相关阅读:
    [LeetCode179]Largest Number
    [LeetCode27]Remove Element
    [LeetCode238]Product of Array Except Self
    [LeetCode169]Majority Element求一个数组中出现次数大于n/2的数
    [LeetCode202]Happy Number判断一个数是不是happy number
    [LeetCode283]Move Zeros将一个数组中为0的元素移至数组末尾
    [LeetCode136]Single Number寻找一个数组里只出现一次的数
    iOS 9: UIStackView入门
    优化UITableViewCell高度计算的那些事
    AutoLayout深入浅出五[UITableView动态高度]
  • 原文地址:https://www.cnblogs.com/mqxnongmin/p/10659546.html
Copyright © 2011-2022 走看看