A type is defined by the operations that create its values and the rules that determine when two created values are equivalent. Read about common int, double, bool types. Some languages allow explicit declaration of subrange types. If you later take the theory course, you will see that subrange types can never be statically typed if assignments are allowed from variables of the whole range to variables of the subrange. The type constructors should exhibit orthogonality, which means that any of the type construction operations can be combined in any way with any of the other type construction operations.
Programmer wants to use a value of one type in a context that expects another.
No code needed. Can use run-time check. Structurally different, such as int to double. Same three possible situations as the programmer-controlled casts. But, when done by the compiler, they are called coercions.