如何printf64位无符号整数,用16进制输出

如何printf64位无符号整数,用16进制输出,第1张

我们先了解一下知识

左移A次 (后面补0,补一次0放大两倍,乘以2的意思)

1010 0100 0010 1101

左移8次

1010 0100 0010 1101 0000 0000

右移K次 (从右往左消数字,直接砍掉,有去掉后面几位的意思,也可以说除以2)

比如

1010 0100 0010 1101

右移2位 就是 10 1001 0000 1011

右移10位 就是 10 1001

16位的数 移动超过16位 就是0了

| 运算符 两数相碰,非0为真

0101

1100

----

1101 (结果)

--------------------------------------

再看此题

a<<k | a>>32-k

可以看成

int tt1 = a<<k

int tt2 = a>>32-k

int tt3 = tt1 | tt2

我们输入一个大一点16进制数0xA42D

转换成2进制,别说你不会,A(1010) 4(0100) 2(0010) D(1101)

1010 0100 0010 1101

我们左移7次,看看效果

1010 0100 0010 1101 先加7个0

1010 0100 0010 1101 000 0000

我们把位置重新调整一下

TT1 = 0101 0010 0001 0110 1000 0000

已经变成0x521680(十六进制) = 5379712(十进制)

在看TT2是右移动32-7个位置,也就是说移动25位,我们没有那么大,就是0了

TT3是两个数做"|"运算

0101 0010 0001 0110 1000 0000

0000 0000 0000 0000 0000 0000

结果

0101 0010 0001 0110 1000 0000

以前写的64位加法及10进制输出,增加了对负数打印支持。参考一下吧。

dseg segment

  a db 9,2,3,4,5,6,7,80H

    db 8 dup (0)

  b db 255,5,4,4,3,3,2,1

    db 8 dup (0)

  c db 8 dup (0)

    db 8 dup (0)

  t db 8 dup (0)

    db 8 dup (0)

  flag db 0

dseg ends

cseg segment

assume cs:cseg, ds:dseg

start:

  mov ax, dseg

  mov ds, ax

  lea si, a

  lea di, b

  call x64_add

  call x64_print

  mov ax, 4c00h

  int 21h

[si] = [si] + [di]

x64_add proc near

  mov cx, 8

  xor ax, ax

  xor bx, bx

  clc

xa0:

  mov al, [si+bx]

  adc al, [di+bx]

  mov [si+bx], al

  inc bx

  loop xa0

  ret

x64_add endp

copy [si] to [di]

x64_copy proc near

  push ax

  push cx

  push bx

  mov cx, 4

  mov bx, 0

cp0:

  mov ax, [si+bx]

  mov [di+bx], ax

  inc bx

  inc bx

  loop cp0

  pop bx

  pop cx

  pop ax

  ret

x64_copy endp

cmp [di]==0

==0, flag=1

x64_cmp0 proc near

  push di

  push cx

  mov cx, 4

  mov flag,0

cmp0:

  mov ax, [di]

  cmp ax, 0

  jnz cmp1

  inc di

  inc di

  loop cmp0

  mov flag, 0

  jmp cmp2

cmp1:

  mov flag, 1

cmp2:

  pop cx

  pop di

  ret

x64_cmp0 endp

abs() function

 source-[si], target-[si]

x64_abs proc near

  mov bx, 7

  mov al, [si+bx]

  test al, 80H

  jz absexit 

abs0:

    mov al,[si+bx]

  not al

  mov [si+bx], al

  dec bx

  jnl abs0

  inc al

  mov [si], al  add 1 to last byte

absexit:

  ret

x64_abs endp

print [si] in decimal

x64_print proc near

  lea di, t copy [si] to temp variable t

  call x64_copy

  mov al, [di+7]

  test al, 80H

  jz print0

  mov ah,0eh

  mov al,'-'

  int 10h

  lea si, t

  call x64_abs

print0:

  xor cx, cx

  mov dl, 10

div0:

  xor ah, ah

  mov bx, 7

div1:

  mov al, [di+bx]

  cmp ax, 0

  jz div2

  div dl

  mov [di+bx], al

div2:

  dec bx

  jns div1

  mov al, ah

  xor al, 30h

  mov ah, 0eh

  push ax

  inc cx

  call x64_cmp0

  cmp flag, 0

  jnz div0

div3:

  pop ax

  int 10h

  loop div3

  ret

x64_print endp

cseg ends

end start


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/6765449.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-03-28
下一篇2023-03-28

发表评论

登录后才能评论

评论列表(0条)

    保存