输出为什么是 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、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
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯