Error in the optimizing section of the blind sql injection module?

We have this script:
LBound = 0, UBound = 127
→ Midpoint = (0+127)//2 = 63
→ Is between 0 and 63? → ASCII(SUBSTRING(password,1,1)) BETWEEN 0 AND 63
→ Yes: UBound = 63 - 1 = 62

LBound = 0, UBound = 62
→ Midpoint = (0+62)//2 = 31
→ Is between 0 and 31? → ASCII(SUBSTRING(password,1,1)) BETWEEN 0 AND 31
→ No: LBound = 31 + 1 = 32

LBound = 32, UBound = 62
→ Midpoint = (32+62)//2 = 47
→ Is between 32 and 47? → ASCII(SUBSTRING(password,1,1)) BETWEEN 32 AND 47
→ Yes: UBound = 47 - 1 = 46

LBound = 32, UBound = 46
→ Midpoint = (32+46)//2 = 39
→ Is between 32 and 39? → ASCII(SUBSTRING(password,1,1)) BETWEEN 32 AND 39
→ No: LBound = 39 + 1 = 40

LBound = 40, UBound = 46
→ Midpoint = (40+46)//2 = 43
→ Is between 40 and 43? → ASCII(SUBSTRING(password,1,1)) BETWEEN 40 AND 43
→ No: LBound = 43 + 1 = 44

LBound = 44, UBound = 46
→ Midpoint = (44+46)//2 = 45
→ Is between 44 and 45? → ASCII(SUBSTRING(password,1,1)) BETWEEN 44 AND 45
→ Yes: UBound = 45 - 1 = 44

LBound = 44, UBound = 45
→ Midpoint = (44+45)//2 = 44
→ Is between 44 and 44? → ASCII(SUBSTRING(password,1,1)) BETWEEN 44 AND 44
→ No: LBound = 44 + 1 = 45

LBound = 45 = Target

In the first iteration for example, if it finds that the target is between 0 and 63, it does this:
→ Yes: UBound = 63 - 1 = 62
I dont see how this makes sense. First of all, no there wouldnt be an infinite loop if you set the upper bound to 63 instead of 62. Since the previous upper bound wasnt 63, it was 127. Also, if the target is literally 63, u literally would never find it? The between function is also very clearly including the 63, since later it does:
→ Is between 0 and 31? → ASCII(SUBSTRING(password,1,1)) BETWEEN 0 AND 31
→ No: LBound = 31 + 1 = 32
If 31 wasnt counted in the between function then it would make no sense to set the lbound at 31+1