[音乐] 最后我们再举一个例子,在C语言当中
在一个表达式当中,类型的转换顺序是这样子的 如果表达式当中,出现的变量类型是char,或者是unsigned
char short 或者 unsigned short
和int型在一起进行运算的时候 那么这种char型或者short型的,不管是带符号,还是
无符号的,都必须转换成int型进行运算 当这个表达式当中,有int型和unsigned
int型 那么这个必须转换成unsigned进行运算
如果有unsigned和long型,必须转换成long long 型,如果说long long型和unsigned long
long型 那么必须转换成unsigned long long型,这个是一个转换的顺序
在这个转换顺序前提条件下,我们来看一看 这个程序它的执行的结果是什么
这边有a这个变量,是unsigned int型 b这个变量是unsigned
short型 c这个变量呢是char型,d这个变量是int型,这边是一个条件表达式
当a大于c的时候,是等于1否则等于0 那么是unsigned
int和char这两种进行比较 下面这个b和c比的时候,是unsigned
short型 和char进行比较,按照这种规则的话
这个地方应该是往上走 按照无符号数,因为c是char类型的
char类型的和unsigned在一起 进行比较的时候,这个比较应该是按照
unsigned int型进行比较,按无符号 这边是unsigned
short型和char比较 unsigned
short型 和char比较,这时候,升级,这两个应该升级成int型
所以在这个表达式当中,它的比较的基准是按int型进行比较
这两种上升为int型,这个是char型和unsigned int型
这种和这种比的时候,它应该 上升成这种,所以上面是按无符号比,下面是按带符号比
因此这个结果等于什么大家应该明白了,我们可以看一下具体的指令
这边实际上这两条这个辅助语句只要用这个SET指令来设置就可以了
到底上面的这个是用什么SET指令,下面的这个用什么SET指令呢?
根据刚才我们分析上面的这个应该是用这个
无符号的比,应该是用b 或者用a,就是below或者above
然后这个的话应该是用g great或者是less用这两个
我们来看一下,这个是刚才程序对应的机器级代码
中间的这些都是二进制的机器指令,右边的 是机器指令的符号表示就是汇编指令
它对应的代码我们可以看出这条语句实现的就是 这个赋值语句,把1赋给a,a存放在这儿
这条语句是把1赋给b,b存放在这儿,这条语句是把负1
负1 的机器数就是全1是FF,送到这儿,c呢就在这儿
然后下面的这三条语句实现的就是这一个赋值语句
在这个里面我们可以看到它是用的b,setb就表示是按无符号比的
然后这四条语句实现的就是这个赋值语句 所以我们可以看到它的这个比较是按照
带符号数比的g,great是带符号数 因此这个比较的结果应该是0,因为按照
无符号数比的话,a是000001
c呢应该是111111,因为负1的机器数应该是全1
所以按无符号比的话,它应该小于它 所以输出应该是0,这个的话是按带符号数比的
那么000001是个正数,111111是个负数,显然正数大于负数,所以输出应该是1
[音乐] [音乐]