Yes, in the general case you would apply nn.CrossEntropyLoss on the logits.
Your use case (sigmoid + BCE) might still work, but has additional properties:
your target could also be [0, 0], i.e. no class is found in the sample, or [1, 1], i.e. both classes are valid for this sample.
This would not be possible using CrossEntropyLoss.
Your code snippet is expected behavior. Softmax calculates the probabilities based on the “distance” between your logits.
You could write it as:
x = torch.tensor([[-3., 5.]])
prob = torch.exp(x) / torch.exp(x).sum()

The logits (input to softmax) aren’t bounded in any way, i.e. they might take really small or large values.
Even negative values would result in a valid probability:
x = torch.tensor([[-100., -99.]])
prob = torch.exp(x) / torch.exp(x).sum()