C++ char变量内存分配问题:VS调试时内存值与显示值不符原因问询
问题原因解释
核心差异是内存存储的原始二进制数据和不同类型下对二进制的解释规则不一致,两个结果本身都是正确的:
1. 二进制与补码规则
你内存中存储的0xAA对应的8位二进制为10101010:
- 当按无符号8位整数解释时,最高位是数值位,直接换算就是十进制的
170,也就是你看内存时调试器展示的原始值。 - 当按**有符号8位补码(signed char在VS/x86环境下的表示规则)**解释时,最高位是符号位,
1代表负数:
负数补码转真值的计算规则为「补码取反+1后加负号」,10101010取反得01010101,加1得01010110(十进制86),加上负号就是你读取signed char时看到的-86。
2. 赋值行为的说明
170超出signed char的-128~127取值范围,这类溢出赋值属于C++标准规定的实现定义行为,Visual Studio的处理逻辑是直接保留整数的低8位二进制存入变量,所以不会修改0xAA的原始存储内容,只是后续读取时按照signed char的类型规则解释数值。
验证方法
你可以尝试用如下代码验证,输出结果会和内存值一致:
// 把地址强制转成unsigned char指针读取 unsigned char c = *reinterpret_cast<unsigned char*>(b); // 此时c的值就是170
内容的提问来源于stack exchange,提问作者user15071942
相关产品推荐
相关产品推荐

