64位与32位对无符号类型处理的区别
来源:互联网 发布:淘宝模版在线制作 编辑:程序博客网 时间:2024/06/09 13:08
原文链接 为什么 A + B != A - (-B) ?
代码如下:
char *A = "123456789";unsigned B = 1;char *X = A + B; // X: "23456789"char *Y = A - (-B); // Y: <Bad Ptr>
如果将上面的代码编译为32位的版本, "A + B" and "A - (-B)" 是相等的,指针 X 和 Y 都指向数组的第二项。看图1 可更好地理解 "A - (-B)" 的计算过程:
图 1
但当编译成 64-bit 程序时, "A + B" 和 "A - (-B)" 是完全不同的值。"-B" 是无符号类型,等于 0xFFFFFFFFu。如图2所示, 指针减去的是0xFFFFFFFFu 这个值:
图 2
在64位系统上会出现访问超出数组范围的错误。这类错误通常发生在用32位的无符号变量存储数组,然后使用负数来引用。下面是个例子:
unsigned Index = -1;Array[Index] = Z;
与前面的情况 一样, "Array[Index] = Z;" 在 32-bit 环境中正常工作,但在64-bit 情况 下会出错。
结论:
应避免使用无符号数据类型来存储负值。如果用来引用数组元素的变量会出现负值,应只使用有符号的数据类型,例如 "int"。或者使用 size_t 和 ptrdfiff_t。
- 64位与32位对无符号类型处理的区别
- 64位有符号与无符号类型的整数
- 对32位的无符号int的位进行操作的一些相关函数
- 32位与64位的区别
- 32位与64位的区别
- 32位和64位对指针的处理的区别 csdn
- 对无符号整形数的比特位反转
- 对32位无符号整数进行排序
- 64位无符号整形格式化符号
- R的32位与64位的区别!
- -1的补码以及无符号32位输出4294967295
- 64位操作系统与32位操作系统的区别
- XP 32位与64位的区别
- 32位系统与64位系统的区别
- 32位与64位的操作系统有什么区别
- 32位操作系统与64位操作系统的区别
- win7 的32位与64位区别是什么?
- 32位与64位操作系统的区别
- css重置样式表reset.css
- 《如何阅读一本书》读后感1
- 代码质量之三-----关键的代码需要单元测试和自己review及交叉review
- iOS 书翻页效果
- Oracle的一些命令
- 64位与32位对无符号类型处理的区别
- 对数据库中的数据进行分页处理的实现
- 9.windbg-!sym、.reload
- JSP于JS的交互
- ios图书翻页效果
- c++画图(2)-初步试验调用python
- Android GridView嵌入ImageButton的问题
- Android ListView 列表控件的简单使用
- 利用c#制作托盘程序,并禁止多个应用实例运行