Turbo C++中整数乘法输出错误有符号值的原因解析
为什么Turbo C++中
1000*100输出负数而1000*10正常? 这事儿的核心原因其实和Turbo C++的16位编译器属性有关,咱们一步步拆解:
首先纠正你对int范围的误解
你提到的(-2147483648 到 +2147483647)是32位有符号整数的范围,但Turbo C++是为16位DOS环境设计的老编译器,它的int类型是16位的,对应的范围是:-32768 到 32767
为什么第一个printf输出错误的负数?
咱们算一下:1000*100 = 100000,这个数值远远超过了16位有符号int的最大值32767。当有符号整数发生溢出时,Turbo C++会按照补码循环溢出的规则处理(虽然C标准里这种溢出属于未定义行为,但老编译器通常这么实现):
- 16位整数的总取值空间是
65536(2^16) - 用
100000对65536取余,得到100000 - 1*65536 = 34464 - 但
34464已经超过了16位有符号int的上限32767,所以需要再减去65536,最终得到34464 - 65536 = -31072,也就是你看到的输出结果。
为什么第二个printf输出正常?
1000*10 = 10000,这个数值完全在16位有符号int的范围(-32768, 32767)内,没有发生溢出,自然能正确输出带符号的结果。
如果换成32位编译器(比如现代的GCC、MSVC),int默认是32位的,那1000*100的结果100000就完全在范围内,输出会是正确的100000。
内容的提问来源于stack exchange,提问作者Himanshu Singh
相关产品推荐
相关产品推荐

