kByte is defined as uint8, so the valid range value is [0, 255], which explains why the values are clipped to this range.
The last approach should also yield values only in this range and should not contain any negative values.
I guess for CV_32S you could use kInt32 instead.