These are called fixnums. And with a good compiler, you can define subtypes of integers that, when packed into an array, have just enough bits in their representation to handle the declared range of values. When a non-Lisp function accepts or returns values in a record datatype, the FFI must provide a means of constructing appropriate records. Fields within a record are set and retrieved using specialized Lisp accessors. An FFI must also support the proper function calling protocol for non-Lisp functions.
Protocols differ by platform and by language.
Lisp function calling conventions normally differ from those used by other languages. It loads object files produced by other languages, providing linker functionality within Lisp for these object files. A linker resolves named entries to code in the object file, and fills in machine addresses in the object code depending upon where the code loads into memory. Finally, an FFI must resolve differences in memory allocation between Lisp and other languages. Unfortunately, most other languages expect objects to remain at a fixed memory address during program execution.