/// @file main.cpp
/// @brief Debug模式下的数组越界访问结果分析
/// 知识点 : 模式地址对齐的数据填充, 浮点数转内存表示, 有符号位扩展,
/// 内存值的打印
#include <iostream>
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) => 0x41210000
1010.0001 * pow(2, 0) = 1.0100001 * pow(2, 3)
SED
S = 0 (整数)
E = 127 + 3 (pow(2,3)) = 130 = 10000010
D = 0100001(1.0100001 * pow(2, 3))
= 0100001 + (补0 23 - 7 = 16)
= 0100001, 0000,0000,0000,0000
= 01000010000000000000000
SED = 0, 10000010, 01000010000000000000000
= 01000001001000010000000000000000
= 0100,0001,0010,0001,0000,0000,0000,0000
= 4 1 2 1 0 0 0 0
= 0x41210000
16进制数字参考表
1000 = 8H
1001 = 9H
1010 = AH
1011 = BH
1100 = CH
1101 = DH
1110 = EH
1111 = FH
130/2
65 0
65/2
32 1
32/2
16 0
16/2
8 0
8/2
4 0
4/2
2 0
2/2
1 0
10.125f整数部分 10 => 1010
10/2
5 0
5/2
2 1
2/2
1 0
10.125f小数部分 0.125f => 0001
0.125f*2
0.250 0
0.250*2
0.5 0
0.5*2
1 0
*/
Debug模式下的数组越界访问结果分析
最新推荐文章于 2023-05-24 00:54:46 发布