A representation is the concrete encoding used to express a value inside a program or in an external file. C programs should primarily reason about values, not their representations, because encodings can vary with the architecture or the type assigned by the programmer. The compiler translates between values and representations, so portable code should avoid depending on concrete encodings unless necessary. section 5.0
Observable value versus hidden representation
Consider `double x = 5.0; double y = 3.0; x = (x * 1.5) - y; printf("x is %g\n", x);`. The expressions produce 5.0, 7.5, 3.0, 4.5, and finally output a string representation of 4.5. Intermediate results are not observable unless stored in addressable memory or sent to an output device. Because only observable states matter, an optimizing compiler may replace the computation with `printf("x is 4.5\n");`, provided the program's observable behavior remains unchanged. section 5.1
double x = 5.0;
double y = 3.0;
...
x = (x * 1.5) - y;
printf("x is \%g\n", x);
!@%STYLE%@!
{"css":"{\"css\": \"font-weight: bold;\"}","target":"[[{\"line\":0,\"ch\":3},{\"line\":0,\"ch\":9}],[{\"line\":1,\"ch\":3},{\"line\":1,\"ch\":9}],[{\"line\":0,\"ch\":3},{\"line\":0,\"ch\":9}],[{\"line\":1,\"ch\":3},{\"line\":1,\"ch\":9}],[{\"line\":4,\"ch\":3},{\"line\":4,\"ch\":9}]]"}
!@%STYLE%@!
Use the complete floating-point example to trace values from declarations through assignment and output, then compare the visible behavior with permitted compiler transformations. section 5.1



