Debug模式下的数组越界访问结果分析

/// @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

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值