The Yorkshire batsman fell one short of his fourth Test century after off-spinner Keshav Maharaj trapped him in front, and the 27-year-old was given out despite reviewing the decision.
Bairstow had understandably mixed feelings, having also fallen five runs short of a century against the same opponents at Lord’s in 2012.
He has hit three Test hundreds since, but had a rueful grin reflecting on his latest near miss.
“I’ve joined a pretty special club... obviously I was pretty annoyed.
“I kicked myself quite a bit, because that’s twice now I’ve got out in the 90s against South Africa.
“But if you look back on it and someone had said ‘You’re going to get 99 today’ you’d take it without a doubt, snap their hand off.
“There were a few expletives (when the decision was given). I’m delighted to get 99, but desperately disappointed at the same time to not jump up to another hundred in Test cricket.
“That’s why I reviewed it. I’m desperately disappointed for everyone to be honest. I’m just pleased to be scoring runs and be out in the middle for periods of time and, hopefully, put us into a position where we can win the series.
Bairstow hailed his side’s performance as the hosts gained the upper hand after posting 362 earlier in the day, with the Proteas sitting at stumps on 220-9.
He added: “It has been a great day for us. In the start, at the huddle, we said ‘let’s go out, let’s bat and get up 300-350 and see how far we can get’. We didn’t actually bat the first session which was our aim but we came out and took some wickets, which was fantastic.”
Bairstow also took his 100th dismissal during the second day of play when he held onto Hashim Amla’s inside edge off the bowling Toby Roland-Jones.
“I’m delighted. You go back to Australia when I first kept wicket, I hadn’t even kept wicket for a full first-class season for Yorkshire and with what people were saying,” he said. “It was quite tough, to be honest, getting criticised for an area of work that you haven’t necessarily been put through your paces at county level.
“But, at the same time, when you get the rewards for working hard, it is really rewarding.”
James Anderson said he felt incapable of bowling badly with his home crowd behind him as he ran in from his own end for the first time at Old Trafford.
England’s leading wicket-taker finished day two of the fourth Test with his best Test figures to date at a venue he has called home throughout his career for club and country.
His 4-33 followed his important 10th-wicket stand with Bairstow.
Anderson responded to that morale-boosting partnership by striking with the third delivery of South Africa’s innings – Dean Elgar lbw for a duck – as he took the new ball from the pavilion end, officially renamed in his honour before start of play.
As he reflected on that success, and a burst of three wickets for six runs in his second spell, the 35-year-old Lancastrian said: “I felt like I couldn’t bowl badly, certainly this morning.
“It feels very strange still to hear it being announced (as the James Anderson end) – but I’m thrilled with it, and to get those wickets as well.”
He had Bairstow to thank for helping to lift the crowd, with a rush of boundaries after being dropped on 53 before dominating their stand of exactly 50.
“We obviously took a lot of momentum from our batting into the field, and there was a really good feeling around the group going out there that we could get early wickets in that 20 minutes before lunch,” added Anderson.
“I was very disappointed for Jonny not to get to three figures, but it was an absolutely crucial knock for us in that situation,” said Anderson.
“I was gutted for him. I thought it was a tough decision – it looked outside the line to me, and could have gone either way really. It was a big effort from us both – and when someone gets towards a milestone, you really want them to get over the line.”