论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() != '\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++数据在内存中的二进制存放形式的更多相关文章
- C/C++数据在内存中的存储方式
目录 1 内存地址 2 内存空间 在学习C/C++编程语言时,免不了和内存打交道,在计算机中,我们存储有电影,文档,音乐等数据,这些数据在内存中是以什么形式存储的呢?下面做一下简单介绍. 本文是学 ...
- 使用程序获取整型数据和浮点型数据在内存中的表示---gyy整理
使用程序获取整型数据和浮点型数据在内存中的表示. C++中整型(int).短整型(short int).单精度浮点数(float).双精度浮点数(double)在内存中所占字节数不同,因此取值范围也不 ...
- 数据在内存中的存储方式( Big Endian和Little Endian的区别 )(x86系列则采用little endian方式存储数据)
https://www.cnblogs.com/renyuan/archive/2013/05/26/3099766.html 1.故事的起源 “endian”这个词出自<格列佛游记>.小 ...
- LITTLE-ENDIAN(小字节序、低字节序) BOM——Byte Order Mark 字节序标记 数据在内存中的存放顺序
总结: 1. endian 字节存放次序 字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了). 2. LITTLE-ENDIA ...
- Redis为什么要把所有数据放到内存中?
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘.所以Redis具有快速和数据持久化的特性. 如果不将数据放到内存中,磁盘的I/O速度会严重影响redis的性能.在内 ...
- SpringMvc 系统启动时加载数据到内存中
SpringMvc 系统启动时加载数据到内存中 学习了:http://blog.csdn.net/newstruts/article/details/18668269 https://www.cnbl ...
- Java的各类型数据在内存中分配情况详解
1. 有这样一种说法,如今争锋于IT战场的两大势力,MS一族偏重于底层实现,Java一族偏重于系统架构.说法根据无从考证,但从两大势力各自的社区力量和图书市场已有佳作不难看出,此说法不虚,但 ...
- C语言之数据在内存中的存储
C语言之数据在内存中的存储 在我们学习此之前,我们先来回忆一下C语言中都有哪些数据类型呢? 首先我们来看看C语言中的基本的内置类型: char //字符数据类型 short //短整型 int //整 ...
- 为什么redis 需要把所有数据放到内存中?
答:Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数 据写入磁盘.所以 redis 具有快速和数据持久化的特征.如果不将数据放在内存中, 磁盘 I/O 速度为严重影响 red ...
随机推荐
- js简介 基本操作 以及循环语句 内置对象 函数044
js 全称 javascript 从交互的角度 描述行为 一 .js注释方法: //单行注释 声明变量 var 二 .声明多个变量 : var a = '2' ,b = 4, c = tru ...
- Yii1 的数据库操作整理
1.根据条件查询一个集合 $objectResult=Post::model()->findAll($condition,$params);$objectResult=Post::model() ...
- 写给初学者的话---linux使用说明
2018年noip上海赛区可以使用window操作系统的美梦终究还是破灭了!!!!上海大部分noip选手都陆陆续续开始改linux........好吧,那我们今天来看看linux操作系统中,noip选 ...
- java连接redis使用jedis带密码
一.引入jedis的Maven配置文件 <!-- redis连接客户端jedis --> <dependency> <groupId>redis.clients&l ...
- cloudemanager安装时出现8475 MainThread agent ERROR Heartbeating to 192.168.30.1:7182 failed问题解决方法(图文详解)
不多说,直接上干货! 问题详情 解决这个问题简单的,是因为有进程占用了.比如 # ps aux | grep super root ? Ss : : /opt/cm-/lib64/cmf/agen ...
- 牛客网Java刷题知识点之垃圾回收算法过程、哪些内存需要回收、被标记需要清除对象的自我救赎、对象将根据存活的时间被分为:年轻代、年老代(Old Generation)、永久代、垃圾回收器的分类
不多说,直接上干货! 首先,大家要搞清楚,java里的内存是怎么分配的.详细见 牛客网Java刷题知识点之内存的划分(寄存器.本地方法区.方法区.栈内存和堆内存) 哪些内存需要回收 其实,一般是对堆内 ...
- [Modelsim] 仿真的基本操作
切换路径,建立库并编译所有源文件之后, 键入命令: vopt +acc topmodulename -o top vsim top 其中topmodulename是顶层模块的名称.
- 数据库中存放着HTML并附带样式,如何在界面上对已有的样式进行修改
在工作中遇到这样一个问题,数据库中存放着HTML代码,并且还带有样式,我要在界面上修改他已经写好的样式,例如把这个字段的字体改成微软雅黑,数据库中对应字段内容如下图 在界面面上是直接把上图这段HTML ...
- Git代码merge
Git代码合并遇到如下问题: <<<<<<< HEAD client.post(url, secretKey, function (data, res ...
- Spring Chapter4 WebSocket 胡乱翻译 (二)
书接上文,Spring Chapter4 WebSocket 胡乱翻译 (一) 4.4.4. 消息流 一旦暴露了STOMP端点,Spring应用程序就成为连接客户端的STOMP代理. 本节介绍服务器端 ...