C语言数据类型自动转换

题目:如下程序输出结果为什么?

#include "stdio.h"
void main()
{
        unsigned char a = 0x55;
        unsigned char b = 0xaa;
        if(a == ~b)
        {
                printf("equal");
        }else
        {
                printf("not equ ");
        }
}

结果是输出 not equ

反汇编得到

 .file   "test.c"
        .section        .rodata
.LC0:
        .string "equal %x"
.LC1:
        .string "not equ %x"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        subq    $16, %rsp
        movb    $85, -2(%rbp)
        movb    $-86, -1(%rbp)
        movzbl  -2(%rbp), %eax
        movzbl  -1(%rbp), %edx
        notl    %edx
        cmpl    %edx, %eax
        jne     .L2
        movzbl  -1(%rbp), %eax
        notl    %eax
        movl    %eax, %esi
        movl    $.LC0, %edi
        movl    $0, %eax
        call    printf
        jmp     .L4
.L2:
        movzbl  -1(%rbp), %eax
        notl    %eax
        movl    %eax, %esi
        movl    $.LC1, %edi
        movl    $0, %eax
        call    printf
.L4:
        nop
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.11) 5.4.0 20160609"
        .section        .note.GNU-stack,"",@progbits

从汇编中的movzbl  -2(%rbp), %eax   与 movzbl  -1(%rbp), %edx 实现了将unsigned char 转化为unsigned int 数据类型。故在比较时就变为 a = 0x00000055,而c=~b=0xffffff55.

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值