论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 ...
随机推荐
- PIE SDK Command、Tool、Control的调用和拓展
1.功能简介 在一个项目中,是通过小组成员共同开发的,难以避免的是当项目功能集成的时候会出现很多兼容性问题,开发讲究高内聚低耦合,利用Command.Tool和Control的使用,可以提升集成的效率 ...
- 利用wireshark和python分析网络
- Python 的 __new__()方法与实例化
__new__() 是新式类中才有的方法,它执行在构造方法创建实例之前.可以这么理解,在 Python 中类中的构造方法 __init__() 负责将类实例化,而在 __init__() 启动之前,_ ...
- 转-------CNN图像相似度匹配 2-channel network
基于2-channel network的图片相似度判别 原文地址:http://blog.csdn.net/hjimce/article/details/50098483 作者:hjimce 一.相 ...
- 表单提交前的confirm验证提示
今天要做一个修改提交前的提示,点击修改按钮进行提示,然后根据confirm的结果来决定是否提交;发现平时很常见的一个功能,自己不会.所以只能去晚上找资料了; 举例如下: <form action ...
- 记自己的hexo个人博客
https://othercoding.github.io/
- JavaScript对象 创建对象(二)
组合使用构造函数和原型模式创建对象 function Person(name, age, job){ this.name = name; this.age = age; this.job = job; ...
- div内容溢出
前几天遇到一个问题,代码是这样一个层次: <div class="province"> <ul> <li>1</li> <li ...
- win10x系统下的Git下载安装
git安装和使用百度一下就有,官方地址https://git-scm.com/book/zh/v1/起步-安装-Git 但是说的并不是很详细,自己记录一下, 首先我们去官网下载一个git 有两个下载地 ...
- python unix时间戳
这是第一次用着python感到怒了,从datetime转化到timestamp数值居然没有直接的函数 直接获取当前时间戳倒是方便: import time timestamp = time.time( ...