初始化unsigned int i = -100时的类型转换工作原理是什么?
有符号整数转无符号整数的转换规则
C/C++标准对有符号整数转无符号整数的行为有明确定义:转换结果等于原数值不断加上「目标无符号类型可表示的最大值 + 1」,直到结果落在目标类型的取值范围内为止,本质就是对2^N取模,其中N是目标无符号类型的比特位数。
你的测试结果计算逻辑
VS在Windows 64位环境下默认int为32位长度,对应32位unsigned int的可表示范围是0 ~ 2^32 - 1,也就是0到4294967295,代入规则计算:-100 + 2^32 = -100 + 4294967296 = 4294967196
和你实际输出的结果完全一致。
二进制层面的对应逻辑
你提到的8位场景下-100的二进制是10011100,这个是有符号整数的补码表示,对应8位无符号值就是156,计算逻辑同样符合规则:2^8 -100 = 256 -100 =156。
放到32位场景下,-100的32位补码是0xFFFFFF9C,直接把这段二进制序列当做无符号整数解析,得到的十进制值就是4294967196,和取模计算的结果完全对应。
转回int得到-100的原因
内存中存储的二进制序列本身没有类型属性,类型只决定解析规则:你将变量强制转换为int时,编译器会把同一段32位二进制序列按照有符号补码的规则解析,自然就得到了原始的-100。
验证代码
你可以运行下面的代码验证转换逻辑:
#include <iostream> #include <climits> using namespace std; int main() { cout << "unsigned int 比特长度:" << sizeof(unsigned int) * 8 << endl; cout << "unsigned int 最大值:" << UINT_MAX << endl; unsigned int i = -100; cout << "规则计算转换结果:" << UINT_MAX + 1 - 100 << endl; cout << "实际输出i:" << i << endl; return 0; }
内容的提问来源于stack exchange,提问作者yurachika2020
相关产品推荐
相关产品推荐

