Hm. The size of a string is not a INT32 but a ptrdiff_t, but that's also a signed type. I wonder if that should be considered a bug... What will happen if you attempt to create a larger string?
For arrays, the fact that the size type is signed is not a problem in itself, since it counts elements and each element is more than 2 bytes large. However, the fact that it is hard-coded as 32 bit seems a little bit problematic. You should be able to create larger arrays than that on a 64-bit system...
Pike v7.8 release 116 running Hilfe v3.5 (Incremental Pike Frontend)
array(int) a = allocate(1<<32);
Bad argument 1 to allocate(). Integer too large to use as array size. Unknown program: allocate(4294967296)
Well, the problem is caught at least, but it would have been better if it had worked instead...