版权声明:本文为博主原创文章,未经博主同意不得转载。 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() != '\n') continue // 应输入数字但实际输入字母则剔除错误输入
#define SHOW_INPUT(str) printf("Please input a %s number ", str) // 显示请输入语句
#define SHOW_ERROR(str) printf("wrong %s number!\n", 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("\n%lld is in %#p\nBinary : ", 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("\n%llu is in %#p\nBinary : ", 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("\n%lld is in %#p\nBinary : ", 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("\n%llu is in %#p\nBinary : ", 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("\n%lld is in %#p\nBinary : ", 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("\n%llu is in %#p\nBinary : ", 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("\n%llu is in %#p\nBinary : ", 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("\n%llu is in %#p\nBinary : ", 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("\n%lld is in %#p\nBinary : ", 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("\n%llu is in %#p\nBinary : ", 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("\n%f is in %#p\nBinary : ", 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("\n%lf is in %#p\nBinary : ", 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("\n%lf is in %#p\nBinary : ", data.ldvalue, &data.ldvalue);
convert(data.array, sizeof(long double));
break; default:
break;
}
}
printf("Bye.\n");
getch();
return 0;
} int menu(void)
{
int i, code, status; for(i = 0; i <= MAX; ++i)
printf("%d\t%s\n",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\n", 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("\n\n"); for (i = 0; i < size; ++i)
{
printf("%#p : \t", 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('\n');
}
putchar('\n');
}

论C/C++数据在内存中的二进制存放形式的更多相关文章

  1. C/C++数据在内存中的存储方式

    目录 1 内存地址 2 内存空间   在学习C/C++编程语言时,免不了和内存打交道,在计算机中,我们存储有电影,文档,音乐等数据,这些数据在内存中是以什么形式存储的呢?下面做一下简单介绍. 本文是学 ...

  2. 使用程序获取整型数据和浮点型数据在内存中的表示---gyy整理

    使用程序获取整型数据和浮点型数据在内存中的表示. C++中整型(int).短整型(short int).单精度浮点数(float).双精度浮点数(double)在内存中所占字节数不同,因此取值范围也不 ...

  3. 数据在内存中的存储方式( Big Endian和Little Endian的区别 )(x86系列则采用little endian方式存储数据)

    https://www.cnblogs.com/renyuan/archive/2013/05/26/3099766.html 1.故事的起源 “endian”这个词出自<格列佛游记>.小 ...

  4. LITTLE-ENDIAN(小字节序、低字节序) BOM——Byte Order Mark 字节序标记 数据在内存中的存放顺序

    总结: 1. endian 字节存放次序 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了). 2. LITTLE-ENDIA ...

  5. Redis为什么要把所有数据放到内存中?

    Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘.所以Redis具有快速和数据持久化的特性. 如果不将数据放到内存中,磁盘的I/O速度会严重影响redis的性能.在内 ...

  6. SpringMvc 系统启动时加载数据到内存中

    SpringMvc 系统启动时加载数据到内存中 学习了:http://blog.csdn.net/newstruts/article/details/18668269 https://www.cnbl ...

  7. Java的各类型数据在内存中分配情况详解

    1.      有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但 ...

  8. C语言之数据在内存中的存储

    C语言之数据在内存中的存储 在我们学习此之前,我们先来回忆一下C语言中都有哪些数据类型呢? 首先我们来看看C语言中的基本的内置类型: char //字符数据类型 short //短整型 int //整 ...

  9. 为什么redis 需要把所有数据放到内存中?

    答:Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数 据写入磁盘.所以 redis 具有快速和数据持久化的特征.如果不将数据放在内存中, 磁盘 I/O 速度为严重影响 red ...

随机推荐

  1. Android百分比布局方案

    百分比布局让其中的控件在指定高度,宽度,margin时使用屏幕宽高的百分比,不使用dp,px.这样一套布局可以适应多个屏幕,方便适配.如: app:layout_heightPercent=" ...

  2. 文献综述八:基于JAVA的商品网站的研究

    一.基本信息 标题:基于JAVA的商品网站的研究 时间:2015 出版源:信息技术 文件分类:对java语言的研究 二.研究背景 本文主要介绍了系统的分析,设计和开发的全部过程. 三.具体内容 文献的 ...

  3. zookeeper 常用命令

    服务管理 启动ZK服务: zkServer.sh start 查看ZK状态: zkServer.sh status 停止ZK服务: zkServer.sh stop 重启ZK服务: zkServer. ...

  4. php高手干货【必看】

    1.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量, 单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的"函数&quo ...

  5. 面试题 数据库sql

    一.建表的结构和数据,在sqlserver直接用就行了 USE [test] GO /****** Object: Table [dbo].[TEACHER] Script Date: 05/16/2 ...

  6. .net和js 获取当前url各种属性

    转来 假设当前页完整地址是:http://www.test.com:80/aaa/bbb.aspx?id=5&name=kelli "http://"是协议名 " ...

  7. NPOI之C#下载Excel

    Java中这个类库叫POI,C#中叫NPOI,很多从Java一直到.Net平台的类库为了区别大部分都是在前面加个N,比如Hibernate和NHibernate. npoi下载地址 一.使用NPOI下 ...

  8. linux防火墙与端口设置

    1.编辑iptables文件 # sudo vi /etc/sysconfig/iptables 添加如下一行 -A INPUT -p tcp -m state --state NEW -m tcp ...

  9. 重构指南 - 封装集合(Encapsulate Collection)

    封装就是将相关的方法或者属性抽象成为一个对象. 封装的意义: 对外隐藏内部实现,接口不变,内部实现自由修改. 只返回需要的数据和方法. 提供一种方式防止数据被修改. 更好的代码复用. 当一个类的属性类 ...

  10. python数据类型(数字\字符串\列表)

    一.基本数据类型——数字 1.布尔型 bool型只有两个值:True和False 之所以将bool值归类为数字,是因为我们也习惯用1表示True,0表示False. (1)布尔值是False的各种情况 ...