下面这段程序调试了之后结果显示为 5,-7,-2;
#include"stdio.h"
#include"iostream"
using namespacestd;
int main(void)
{
unsigned int a=5;
int b=-7,c=4;
if(b+a>0)
c=a+b,b=c-a;
else
c=a-b,b=c+a;
cout<
return 0;
}
本以为结果会是c=12,b=17,a=5不变。主要是因为b+a等于-2是小于零的,进入else中执行。在VISUAL C++中单步调试后发现实际上程序在if判断后进入了if语句。即b+a是大于零成立的。为什么没有进入else呢?重新观察代码后,知道a变量时unsignedint类型,而b是int类型,二者相加之后到底结果是什么类型呢?这就涉及到了不同类型变量运算时类型提升的一个问题!
两个不同类型的变量相加,结果的类型应该遵循下面的原则:相加的变量中,哪个类型能表示的数值更大,结果就转换为哪个类型。Short+long ,结果就要转换为long。对与unsigned int与int类型相加,在32位机器上,unsigned int能表示的最大值是2^32-1,int最大可表示2^31-1.因为结果应该转换为unsignedint 类型。这样相加时,int提升为unsignedint。
unsigned int a=5; int b=-7;b为负值,最高位为1,转换为无符号整型后,最高位不再表示符号,而是表示该类型的数值,是一个很大的正数,所有二者相加的结果也是一个很大的整数。于是理所当然的进入if语句。
在if和else分支中,用到了逗号表达式,例如:
c=a+b,b=c-a;先执行c=a+b,再执行b=c-a,整个表达式的最终值是最后一个表达的值,若int resullt=(c=a+b,b=c-a);则结果result与b的值一样。
二进制表示:
unsignedint a=5;红色
int b=-7;黑色
补码:00000000 00000000 00000000 00000101
原码:10000000 00000000 0000000 00000111
补码:111111111 11111111 11111111 11111001
补码相加:11111111 11111111 11111111 11111110
转换为c的类型,c是int;
最高位是1,是负数,补码转换为原码
先减一再取反
11111111 11111111 11111111 111111101
10000000 00000000 00000000 00000010
就是-2即是c的结果