永发信息网

输出为什么是 44 300

答案:2  悬赏:40  手机版
解决时间 2021-11-11 21:00
  • 提问者网友:十年饮冰
  • 2021-11-11 12:36
输出为什么是 44 300
最佳答案
  • 五星知识达人网友:归鹤鸣
  • 2021-11-11 13:30
你好!!
1、44 的 产生过程:
d 定义为char 类型,char 类型最大值是 255;
所以你 d = c+b ; 的时候,300 已经被取了 256 余数,也就是 44 了
2、300 的产生过程:
c 和 b都同一个类型 int ,所以 c+b; 就是等于 300追问改为有符号的char 输出成了44 44追答给你一个char字符表,你对照着看看吧

字符串最大就是255,也就是 char 的最大值就是 255,你相加的值超过255,就会被取余数

全部回答
  • 1楼网友:迷人又混蛋
  • 2021-11-11 14:49

这个单从C语言的角度很难讲明白。我给你个更合适的答案,等下帖上来。


先看下C代码

#include 
//#include
int main(void)
{
    unsigned char c=100;
    unsigned char b=200;
    char d,e,f;
    d=c+b;
    printf("%d %d ",d,(c+b));
    
    d =100;
    e = 200;
    f = d+e;
    
    return 0;
}

接下来让我们看看编译器把代码翻译成汇编之后的样子


_DATA    SEGMENT
$SG2940    DB    '%d', 0aH, '%d', 0aH, 00H
_DATA    ENDS
PUBLIC    _main
EXTRN    _printf:PROC
_TEXT    SEGMENT
_f$ = -5                        ; size = 1
_e$ = -4                        ; size = 1
_b$ = -3                        ; size = 1
_c$ = -2                        ; size = 1
_d$ = -1                        ; size = 1
_main    PROC
; 4    : {
    push    ebp
    mov    ebp, esp
    sub    esp, 8
; 5    :     unsigned char c=100;
    mov    BYTE PTR _c$[ebp], 100            ; 00000064H

; 6    :     unsigned char b=200;

    mov    BYTE PTR _b$[ebp], 200            ; 000000c8H

; 7    :     char d,e,f;
; 8    :     d=c+b;
    movzx    eax, BYTE PTR _c$[ebp]
    movzx    ecx, BYTE PTR _b$[ebp]
    ; 这两个是无符号扩展传送到32位寄存器中的
    ;之后  eax 中是 00000064H 
    ; ecx 中是 000000c8H
    add    eax, ecx
    ;add之后的结果放成eax中 ,为 0000012CH
    mov    BYTE PTR _d$[ebp], al
    ;把eax中的低八位,也就是 2CH传给 变量d所在内存, 2c 就是十进制的44

; 9    :     printf("%d %d ",d,(c+b));
    movzx    edx, BYTE PTR _c$[ebp]
    movzx    eax, BYTE PTR _b$[ebp]
    add    edx, eax
    ;这三个步骤同上,没什么区别
    push    edx ;区别来了,这时没有截断,而是直接把 0000012CH这个值压栈了
    movsx    ecx, BYTE PTR _d$[ebp] ;这里压入栈的是前面截好的 2CH
    push    ecx
    push    OFFSET $SG2940
    call    _printf
    add    esp, 12                    ; 0000000cH
; 10   :     
; 11   :     d =100;

;;;;;;下面是两个有符号的char 相加的情景
    mov    BYTE PTR _d$[ebp], 100            ; 00000064H
; 12   :     e = 200;
    mov    BYTE PTR _e$[ebp], -56            ; ffffffc8H
    ; e 赋值是200 ,二进制表示为 (1100 1000)2也就是 c8
    ;最高位的符号为是1,表示负数,于是扩展到32位数就是,ffffffc8H
    
; 13   :     f = d+e;
    movsx    edx, BYTE PTR _d$[ebp]
    ;符号扩展后放入edx, 64H符号位是0,所以放入的是00000064H
    movsx    eax, BYTE PTR _e$[ebp]
    ;符号扩展后放入eax, c8H符号位是1,所以放入的是ffffffc8H
    add    edx, eax
    ; 00000064H 与 ffffffc8H 相加后,或不丢失最高位就是
    ;10000002CH,但是最高位的1忆经是第33位了,而edx只有32个位,所以
    ;实际结果是 0000002CH,当然,同时有其它的寄存器被改掉了。这里我们不管了
    mov    BYTE PTR _f$[ebp], dl
; 14   :     
; 15   :     return 0;
    xor    eax, eax
; 16   : }
    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP
_TEXT    ENDS
END
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯