Why the location of b has BBBBAAAA instead of BBBB it is supposed to have?
It doesn't. The location of b has 0x42424242 (when interpreted as an int). But by running x/s &b (as opposed to print b) you are telling gdb to print a string starting at the location of b, rather than to print the int stored there.
It so happens that the bytes stored at the location of b look like "BBBB" when interpreted as ASCII, and the bytes after that look like "AAAA@" when interpreted as ASCII, and then there are some more bytes that aren't printable characters so gdb prints them as escape codes instead, and then there's a 0 byte (which indicates the end of a string).
What does the @\336\377\377\377\177 signify?
@ is the character @. \336 and \337 and \177 are escape codes - the bytes following the @ aren't displayable characters, so gdb prints them as octal escape codes instead (using C syntax).