In source files which I am using in my project, there is a comparison between ssize_t
and size_t
variables:
ssize_t sst;
size_t st;
if
There is no one right answer to this question. There are several possible answers, depending on what you know a priori about the values that those variables may take on.
If you know that sst
is non-negative, then you can safely cast sst
to size_t
, as this will not change the value (incidentally, this is what happens if you have no cast at all).
If sst
might be negative but you know that st
will never be larger than SSIZE_MAX
, then you can safely cast st
to ssize_t
, as this will not change the value.
If sst
might be negative, and st
might be larger than SSIZE_MAX
, then neither cast is correct; either one could change the value, resulting in an incorrect comparison. Instead, you would do the following if (sst >= 0 && (size_t)sst == st)
.
If you’re not absolutely certain that one of the first two situations applies, choose the third option as it is correct in all cases.
Either will work fine as long as both values fit in the positive representable range of ssize_t
.
If either value doesn't, you could end up in trouble - check those cases before testing for equality:
if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st))
{
...
}
(I'm sure the C++ people will recommend you avoid the C-style cast entirely - I have no doubt someone will comment or answer and let you know the right way to do that in C++.)