Conversation

There are a few different keys (not directly accessible) and they sign a pair of values: pointer and a value chosen by the code to differentiate between different pointers based on something like their own address, a type hash, etc. It doesn't actually need to be a real pointer.
1
If you want to use it to implement *signed* integers, that should work fine as long as you don't mind having some of their bits missing and some awkwardness. Hasn't really worked out that well so far as a security feature since it protects exploitation targets, not the sources.