设为首页 加入收藏

TOP

论C/C++数据在内存中的二进制存放形式(二)
2015-07-24 06:13:47 来源: 作者: 【 】 浏览:52
Tags:C/C 数据 内存 二进制 存放 形式
(scanf("%lld", &ll_data.value) != 1) { while (getchar() != '\n') continue; printf("wrong long long number!\n"); printf("Please input a long long number (%lld to %lld) : ", LLONG_MIN, LLONG_MAX); } printf("\n%lld is in %#p\nBinary : ", ll_data.value, &ll_data.value); convert(ll_data.array, sizeof(long long)); break; case 8: // unsigned long long printf("Please input a unsigned long long number (0 to %llu) : ", ULLONG_MAX); while (scanf("%llu", &llu_data.value) != 1) { while (getchar() != '\n') continue; printf("wrong unsigned long long number!\n"); printf("Please input a unsigned long long number (0 to %llu) : ", ULLONG_MAX); } printf("\n%llu is in %#p\nBinary : ", llu_data.value, &llu_data.value); convert(llu_data.array, sizeof(unsigned long long)); break; case 9: // float printf("Please input a float number : "); while (scanf("%f", &f_data.value) != 1) { while (getchar() != '\n') continue; printf("wrong float number!\n"); printf("Please input a float number : "); } printf("\n%f is in %#p\nBinary : ", f_data.value, &f_data.value); convert(f_data.array, sizeof(float)); break; case 10: // double printf("Please input a double number : "); while (scanf("%lf", &d_data.value) != 1) { while (getchar() != '\n') continue; printf("wrong double number!\n"); printf("Please input a double number : "); } printf("\n%lf is in %#p\nBinary : ", d_data.value, &d_data.value); convert(d_data.array, sizeof(double)); break; default: break; } } printf("Bye.\n"); getch(); return 0; } int menu(void) { int code, status; printf("0\texit\n"); printf("1\tchar\n"); printf("2\tunsigned char\n"); printf("3\tshort\n"); printf("4\tunsigned short\n"); printf("5\tint\n"); printf("6\tunsigned int\n"); printf("7\tlong long\n"); printf("8\tunsigned long long\n"); printf("9\tfloat\n"); printf("10\tdouble\n"); printf("Please enter the number to select : "); while ((status = scanf("%d", &code)) != 1 || (code > MAX || code < 0)) { if (status != 1) scanf("%*s"); printf("enter an integer from 0 to %d,please\n", MAX); } return code; } void convert(const unsigned char * const ch, char size) { char i, j; unsigned char mask; // 掩码用unsigned类型是为了无符号数右移以0填充 for (i = size - 1; i >= 0; --i) { mask = 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 == 7) putchar(' '); } } printf("\n\n"); for (i = 0; i < size; ++i) { printf("%#p : \t", ch + i); mask = 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 == 7) putchar(' '); } putchar('\n'); } putchar('\n'); } // 其实输入的都是long long或unsigned long long数据 // 只不过显示的时候都被截断了 // 自我感觉写得不好 应该还能优化

总结:左侧为内存高地址,右侧为低地址 数据首地址为最末字节的地址 见图

\

?? ?? ??
首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Swift中利用单例管理FMDB数据库 下一篇三层学习------理论篇

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: