如何使用小工具查看基本数据类型在内存中的存储表示?

2026-05-17 08:101阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1134个文字,预计阅读时间需要5分钟。

在编写这个小程序之前,我们先了解一下命令行参数。命令行参数。什么是命令行参数?应用程序在命令行方式执行时,以字符串数组的形式传递给main方法的参数。一般格式(运行应用程序)。

在写这个小工具之前我们先了解一下命令行参数。

命令行参数。

什么是命令行参数?应用程序在命令行方式执行时,以字符串数组的形式传递给main方法的参数。

一般格式(运行应用程序时) : 应用程序名 串1 串2 ...... 串n

按国际标准,c程序标准的main函数头只有两种:

1、不带命令行参数。

int main(void) { } 2、带命令行参数。

int main(int argc,char* argv[]) { //argc:命令行参数的个数 argument count //char *argv[]:argument vector数组,每个元素char* 字符串。 //第二个参数也可以写成char** argv。 }

特别注意:c语言中命令行运行时:程序名 字符串1 字符串2 ...... 字符串n。

argv[0] = "程序名.exe" argv[1] = "字符串1" ...... argv[argc - 1] = "字符串n"。

查看基本数据类型数据在内存中的存储表示小工具

//显示一个字节的8位 void showByte(char ch)//参数:传入一个字节 { /*利用移位实现*/ for (int i = 7; i >= 0; --i) { printf("%d",(ch >> i) & 1);//注意:对ch移位并不会改变ch原有的值,因为没有赋值 } printf(" "); } void showByte(char ch, int n)//参数1:传入一个字节。参数2:输出一个字节要显示的位数 { /*利用递归实现*/ if (n == 0) { printf(" "); return; } else { showByte(ch >> 1, n - 1); printf("%d",ch & 1); } } /*利用共用体和字段实现*/ union uct { char ch; struct bt//字段 { unsigned char b0 : 1; unsigned char b1 : 1; unsigned char b2 : 1; unsigned char b3 : 1; unsigned char b4 : 1; unsigned char b5 : 1; unsigned char b6 : 1; unsigned char b7 : 1; }bit; }uc; void showByte_a(char ch)//参数:传入一个字节 { uc.ch = ch; printf("%d%d%d%d%d%d%d%d ", uc.bit.b7, uc.bit.b6, uc.bit.b5, uc.bit.b4, uc.bit.b3, uc.bit.b2, uc.bit.b1, uc.bit.b0); } void showByte_b(char ch)//参数:传入一个字节 { /*利用查表法实现*/ const char* t[] = { "0000","0001", "0010","0011", "0100","0101","0110","0111","1000","1001","1010", "1011","1100","1101","1110","1111" }; printf("%s%s ", t[(ch >> 4) & 0xf], t[ch & 0xf]);//将传入的参数分为高四位与第四位,在表中查找相对应的值并输出 } int main(int argc ,char* argv[]) { /*用法: -h/-b char/short/int/long/long long/float/double 待查看的数据*/ union //共用体 { char ch[81]; short s; int i; long l; long long ll; float f; double d; }u; int size = 1; // 默认查看的数据占的字节数 bool isBinary = 1;//默认为查看二进制 if (!strcmp("-h", argv[1])) { //查看方式为-h,十六进制 isBinary = 0; } else if(!strcmp("-b", argv[1])) { //查看方式为-b,二进制 isBinary = 1; } if (!(argc == 4 || argc == 5)) { printf("参数输入有误\n"); exit(0); //退出整个程序 } //判断参数类型 if (!strcmp("char", argv[2])) { strcpy(u.ch, argv[3]); size = strlen(u.ch); } else if(!strcmp("short",argv[2])) { u.s = atoi(argv[3]); size = sizeof(u.s); } else if (!strcmp("int", argv[2])) { u.i = atoi(argv[3]); size = sizeof(u.i); } else if (!strcmp("long", argv[2]) && !strcmp("long", argv[3])) { u.ll = atol(argv[4]); size = sizeof(u.ll); } else if (!strcmp("long", argv[2])) { u.l = atoll(argv[3]); size = sizeof(u.l); } else if (!strcmp("float", argv[2])) { u.f = atof(argv[3]); size = sizeof(u.f); } else if (!strcmp("short", argv[2])) { u.d = atof(argv[3]); size = sizeof(u.d); } /* //输出在内存中的表示 if (!strcmp("char",argv[1])) { for (int i = 0; i < size; ++i) { printf("%02x ", u.ch[i] & 0xff); } } else { //倒序输出是因为采用了小端机存储,如果正序输出数据就会反过来表示 for (int i = size - 1; i >= 0; --i) { printf("%02x ", u.ch[i] & 0xff); } } */ //或者也可以使用指针输出 if (!strcmp("char",argv[2]))//字符要分开输出,因为其他类型是用小端机存储,所以得倒序输出。 { for (char* p = u.ch; p < u.ch + size ; ++p) { if (isBinary) { //二进制输出 showByte_b(*p & 0xff); } else { //十六进制输出 printf("%02x ", *p & 0xff); } } } else //其他类型数据 { for (char* p = u.ch + size -1 ; p >= u.ch; --p) { if (isBinary) { //二进制输出 showByte_b(*p & 0xff); } else { //十六进制输出 printf("%02x ", *p & 0xff); } } } system("pause"); return 0; } 在vs里面如和输入命令行参数:

项目---》属性---》调试---》命令行参数;然后直接输入你要输入的命令行参数,然后就可以直接进行调试了

标签:存储表示

本文共计1134个文字,预计阅读时间需要5分钟。

在编写这个小程序之前,我们先了解一下命令行参数。命令行参数。什么是命令行参数?应用程序在命令行方式执行时,以字符串数组的形式传递给main方法的参数。一般格式(运行应用程序)。

在写这个小工具之前我们先了解一下命令行参数。

命令行参数。

什么是命令行参数?应用程序在命令行方式执行时,以字符串数组的形式传递给main方法的参数。

一般格式(运行应用程序时) : 应用程序名 串1 串2 ...... 串n

按国际标准,c程序标准的main函数头只有两种:

1、不带命令行参数。

int main(void) { } 2、带命令行参数。

int main(int argc,char* argv[]) { //argc:命令行参数的个数 argument count //char *argv[]:argument vector数组,每个元素char* 字符串。 //第二个参数也可以写成char** argv。 }

特别注意:c语言中命令行运行时:程序名 字符串1 字符串2 ...... 字符串n。

argv[0] = "程序名.exe" argv[1] = "字符串1" ...... argv[argc - 1] = "字符串n"。

查看基本数据类型数据在内存中的存储表示小工具

//显示一个字节的8位 void showByte(char ch)//参数:传入一个字节 { /*利用移位实现*/ for (int i = 7; i >= 0; --i) { printf("%d",(ch >> i) & 1);//注意:对ch移位并不会改变ch原有的值,因为没有赋值 } printf(" "); } void showByte(char ch, int n)//参数1:传入一个字节。参数2:输出一个字节要显示的位数 { /*利用递归实现*/ if (n == 0) { printf(" "); return; } else { showByte(ch >> 1, n - 1); printf("%d",ch & 1); } } /*利用共用体和字段实现*/ union uct { char ch; struct bt//字段 { unsigned char b0 : 1; unsigned char b1 : 1; unsigned char b2 : 1; unsigned char b3 : 1; unsigned char b4 : 1; unsigned char b5 : 1; unsigned char b6 : 1; unsigned char b7 : 1; }bit; }uc; void showByte_a(char ch)//参数:传入一个字节 { uc.ch = ch; printf("%d%d%d%d%d%d%d%d ", uc.bit.b7, uc.bit.b6, uc.bit.b5, uc.bit.b4, uc.bit.b3, uc.bit.b2, uc.bit.b1, uc.bit.b0); } void showByte_b(char ch)//参数:传入一个字节 { /*利用查表法实现*/ const char* t[] = { "0000","0001", "0010","0011", "0100","0101","0110","0111","1000","1001","1010", "1011","1100","1101","1110","1111" }; printf("%s%s ", t[(ch >> 4) & 0xf], t[ch & 0xf]);//将传入的参数分为高四位与第四位,在表中查找相对应的值并输出 } int main(int argc ,char* argv[]) { /*用法: -h/-b char/short/int/long/long long/float/double 待查看的数据*/ union //共用体 { char ch[81]; short s; int i; long l; long long ll; float f; double d; }u; int size = 1; // 默认查看的数据占的字节数 bool isBinary = 1;//默认为查看二进制 if (!strcmp("-h", argv[1])) { //查看方式为-h,十六进制 isBinary = 0; } else if(!strcmp("-b", argv[1])) { //查看方式为-b,二进制 isBinary = 1; } if (!(argc == 4 || argc == 5)) { printf("参数输入有误\n"); exit(0); //退出整个程序 } //判断参数类型 if (!strcmp("char", argv[2])) { strcpy(u.ch, argv[3]); size = strlen(u.ch); } else if(!strcmp("short",argv[2])) { u.s = atoi(argv[3]); size = sizeof(u.s); } else if (!strcmp("int", argv[2])) { u.i = atoi(argv[3]); size = sizeof(u.i); } else if (!strcmp("long", argv[2]) && !strcmp("long", argv[3])) { u.ll = atol(argv[4]); size = sizeof(u.ll); } else if (!strcmp("long", argv[2])) { u.l = atoll(argv[3]); size = sizeof(u.l); } else if (!strcmp("float", argv[2])) { u.f = atof(argv[3]); size = sizeof(u.f); } else if (!strcmp("short", argv[2])) { u.d = atof(argv[3]); size = sizeof(u.d); } /* //输出在内存中的表示 if (!strcmp("char",argv[1])) { for (int i = 0; i < size; ++i) { printf("%02x ", u.ch[i] & 0xff); } } else { //倒序输出是因为采用了小端机存储,如果正序输出数据就会反过来表示 for (int i = size - 1; i >= 0; --i) { printf("%02x ", u.ch[i] & 0xff); } } */ //或者也可以使用指针输出 if (!strcmp("char",argv[2]))//字符要分开输出,因为其他类型是用小端机存储,所以得倒序输出。 { for (char* p = u.ch; p < u.ch + size ; ++p) { if (isBinary) { //二进制输出 showByte_b(*p & 0xff); } else { //十六进制输出 printf("%02x ", *p & 0xff); } } } else //其他类型数据 { for (char* p = u.ch + size -1 ; p >= u.ch; --p) { if (isBinary) { //二进制输出 showByte_b(*p & 0xff); } else { //十六进制输出 printf("%02x ", *p & 0xff); } } } system("pause"); return 0; } 在vs里面如和输入命令行参数:

项目---》属性---》调试---》命令行参数;然后直接输入你要输入的命令行参数,然后就可以直接进行调试了

标签:存储表示