Type definitions in MiniC and C are different, and in my opinion cleaner in MiniC than in C. Types are types, and names are names, and in MiniC a declaration has the form <type> <name> to declare a variable with a name and a type. In C, it depends what kind of type it is, for arrays the dimensions are added to the name while the rest of the type is written in front of it. So, it was intentionally defined differently in MiniC to clearly distinguish between types and names (also when implementing the language, you will have a data type for its types where arrays will be one of the possible types).

About div and mod: Essentially all algorithms to compute one of the two will also compute the other one. Hence, having computed (x div y), we also have somewhere (x mod y), and if we need both, there would be no need to recompute what we already have. The problem was just that RISC instructions do not provide more than one target register. So, the solution was to use the overflow register in this case for (x mod y) which is used for addition and multiplication to compute the upper half of a double-precision result. Indeed, to compute (x mod y), it is therefore correct in the assembly code to have computed (x div y) to get (x mod y) from the overflow register.

Simplification of div and mod as well as multiplication with powers of 2 can be done by a code optimizer, but that does not generalize easily to other operands.