(int32_t)4294967294

本文最后更新于:2023年12月5日 晚上

注: int 是有符号、unsigned int 是无符号;

gdb 调试数组的时候, nTableMask = 4294967294, 因为 nTableMask 是 unsigned int 类型, 所以使用(int)4294967294 转成 int 后结果是 2;

那为什么是 2 呢?

因为 unsigned int 和 int 之间的转化是按照实际存储的二进制进行转换的, 转换的时候二进制值不变。
所以, 如果最高位为 0 的, unsigned int 和 int 转换后值不变; 如果最高位为 1, 那么当有符号数转为无符号数时,最高位表示数值,而不是符号。反之最高位表示符号,而不是值。
重新根据补码规则运算。如果要找规律,如果 int 为 N 位(根据平台,N 为 16 或者 32,一般为 32)。
有符号转无符号,原本有符号值为 k,那么转换后的值为 2^N+k。
无符号转有符号,原本无符号值为 k,转换后的值为 k-2^N。
2^N 表示 2 的 N 次幂。

正数一般自动转换的数不变,但如果是负数可能会转换成一个很大的正数。


(int32_t)4294967294
http://blog.lujinkai.cn/PHP/源码/(int32_t)4294967294/
作者
像方便面一样的男子
发布于
2020年12月9日
更新于
2023年12月5日
许可协议