Debug模式下的数组越界访问结果分析
发布日期:2021-06-30 22:08:36 浏览次数:2 分类:技术文章

本文共 2008 字,大约阅读时间需要 6 分钟。

/// @file main.cpp/// @brief Debug模式下的数组越界访问结果分析///     知识点 : 模式地址对齐的数据填充, 浮点数转内存表示, 有符号位扩展, ///             内存值的打印#include 
using namespace std;/// Debug模式int main() { float f = 10.125f; char szBuf[5] = {'\0'}; int iTmp = 0; // 10.125f 转内存表示 1010.0001 * pow(2, 0) => 0x41210000 /** 内存布局 低地址 &szBuf[0] 00 00 00 00 00 ///< 开始地址为模式地址 &szBuf[5] cc cc cc ///< 由于模式地址对齐填充的内容, debug模式下为0xcc &f 00 00 21 41 高地址 */ /// 有符号数扩展时,是用符号位(最高位)进行填充的 /// -1 = 0xff => 0xffffffff /// -128 = 0x80 => 0xffffff80 ///< iTmp = (int)(char)0x80; /// -52 = 0xcc => 0xffffffcc iTmp = (int)(char)0xcc; /// szBuf[6] 是0xcc => (int)(char)0xcc => 0xffffffcc /// 打印出来是 ffffffcc cout << hex << (int)szBuf[6] << endl; /// 如果szBuf输入了123456789, 算上模式地址对齐填充字节, 覆盖了((char*)&f)[0] /** 内存布局 低地址 &szBuf[0] 31 32 33 34 35 ///< 开始地址为模式地址 &szBuf[5] 36 37 38 ///< 由于模式地址对齐填充的内容, debug模式下为0xcc &f 39 00 21 41 高地址 */ cin >> szBuf; ///< 123456789 /// 将f内容作为一个指针值打印出来 /// f的内存表示为0x41210039 /// 所以按照16进制值打印出来为41210039 cout << hex << (int&)f << endl; cout << hex << *(int*)&f << endl; ///< 这样也是可以的 /** run result ffffffcc 123456789 41220039 41220039 */ return 0;}/**10.125f 转内存表示 1010.0001 * pow(2, 0) => 0x412100001010.0001 * pow(2, 0) = 1.0100001 * pow(2, 3)SEDS = 0 (整数)E = 127 + 3 (pow(2,3)) = 130 = 10000010D = 0100001(1.0100001 * pow(2, 3)) = 0100001 + (补0 23 - 7 = 16) = 0100001, 0000,0000,0000,0000 = 01000010000000000000000SED = 0, 10000010, 01000010000000000000000 = 01000001001000010000000000000000 = 0100,0001,0010,0001,0000,0000,0000,0000 = 4 1 2 1 0 0 0 0 = 0x4121000016进制数字参考表1000 = 8H1001 = 9H1010 = AH1011 = BH1100 = CH1101 = DH1110 = EH1111 = FH130/265 065/232 132/216 016/28 08/24 04/22 02/21 010.125f整数部分 10 => 101010/25 05/22 12/21 010.125f小数部分 0.125f => 00010.125f*20.250 00.250*20.5 00.5*21 0*/

转载地址:https://lostspeed.blog.csdn.net/article/details/50571230 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:嵌套宏展开和浮点数内存值位运算
下一篇:DEBUG模式下, 内存中的变量地址分析

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月18日 10时28分45秒