论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('
');
}

原文地址:https://www.cnblogs.com/mqxnongmin/p/10659546.html