aboutsummaryrefslogtreecommitdiff
path: root/ch2
diff options
context:
space:
mode:
Diffstat (limited to 'ch2')
-rw-r--r--ch2/2-01_limits.c142
1 files changed, 142 insertions, 0 deletions
diff --git a/ch2/2-01_limits.c b/ch2/2-01_limits.c
new file mode 100644
index 0000000..666685b
--- /dev/null
+++ b/ch2/2-01_limits.c
@@ -0,0 +1,142 @@
+#include <stdio.h>
+#include <limits.h>
+#include <float.h>
+
+/* The C Programming Language, 2nd Edition
+ *
+ * Exercise 2-1: Write a program to determine the ranges of char, short,
+ * int, and long variables, both signed and unsigned, by printing
+ * appropriate values from standard headers and by direct computation.
+ * Harder if you compute them: determine the ranges of the various
+ * floating-point types.
+ *
+ * Answer: The trick to computing these numbers is to understand computer math,
+ * which is done in binary, thus with 2. Keep squaring from 1 and you'll
+ * eventually find the limit of the variable. Add or subtract from one of the
+ * extremes and you'll find the other extreme.
+ *
+ */
+
+int main() {
+ unsigned char uc;
+ signed char sc;
+ unsigned short us;
+ signed short ss;
+ unsigned int ui;
+ signed int si;
+ unsigned long ul;
+ signed long sl;
+ unsigned long long ull;
+ signed long long sll;
+ float fl, fla, fll;
+ double db, dba, dbl;
+ long double ldb, ldba, ldbl;
+
+ printf("Let's compute the minimums and maximums of each type!\n");
+ uc = sc = us = ss = ui = si = ul = sl = sll = ull = 0;
+ fl = fla = fll = db = dba = dbl = ldb = ldba = ldbl = 0.0;
+
+ /* Characters */
+
+ sc++;
+ while (sc * 2 > sc) {
+ sc = sc * 2 + 1;
+ }
+
+ printf("`signed char` maximum: %d\n", sc);
+ sc++;
+ printf("`signed char` minimum: %d\n", sc);
+ uc--;
+ printf("`unsigned char` maximum: %u\n", uc);
+
+ /* Short ints */
+
+ ss++;
+ while (ss * 2 > ss) {
+ ss = ss * 2 + 1;
+ }
+
+ printf("`signed short` maximum: %d\n", ss);
+ ss++;
+ printf("`signed short` minimum: %d\n", ss);
+ us--;
+ printf("`unsigned short` maximum: %u\n", us);
+
+ /* Integers */
+
+ si++;
+ while (si * 2 > si) {
+ si = si * 2 + 1;
+ }
+
+ printf("`signed int` maximum: %d\n", si);
+ si++;
+ printf("`signed int` minimum: %d\n", si);
+ ui--;
+ printf("`unsigned int` maximum: %u\n", ui);
+
+ /* Long ints */
+
+ sl++;
+ while (sl * 2 > sl) {
+ sl = sl * 2 + 1;
+ }
+
+ printf("`signed long` maximum: %li\n", sl);
+ sl++;
+ printf("`signed long` minimum: %li\n", sl);
+ ul--;
+ printf("`unsigned long` maximum: %lu\n", ul);
+
+ /* Long long ints */
+
+ sll++;
+ while (sll * 2 > sll) {
+ sll = sll * 2 + 1;
+ }
+
+ printf("`signed long long` maximum: %lli\n", sll);
+ sll++;
+ printf("`signed long long` minimum: %lli\n", sll);
+ ull--;
+ printf("`unsigned long long` maximum: %llu\n", ull);
+
+ /* Floats */
+ while (fl == 0.0) {
+ fll = fla;
+ fla = fla + 1111e28;
+ fl = (fl + fla) - fla;
+ }
+
+ printf("`float` maximum: %e\n", fll);
+
+ fl = 0.0;
+ fll = 0.0;
+ fla = 0.0;
+ while (fl == 0.0) {
+ fll = fla;
+ fla = fla - 1111e28;
+ fl = (fl - fla) + fla;
+ }
+
+ printf("`float` minimum: %e\n", fll);
+
+ /* Doubles */
+ while (db == 0.0) {
+ dbl = dba;
+ dba = dba + 1111e297;
+ db = (db + dba) - dba;
+ }
+
+ printf("`float` maximum: %e\n", dbl);
+ printf("`float` minimum: -%e\n", dbl);
+
+ printf("\nNow, let's cheat and use the helpful headers!\n");
+ printf("`char`s go from %d to %d (unsigned, up to %u)\n", SCHAR_MIN, SCHAR_MAX, UCHAR_MAX);
+ printf("`short`s go from %d to %d (unsigned, up to %u)\n", SHRT_MIN, SHRT_MAX, USHRT_MAX);
+ printf("`int`s go from %d to %d (unsigned, up to %u)\n", INT_MIN, INT_MAX, UINT_MAX);
+ printf("`long`s go from %ld to %ld (unsigned, up to %lu)\n", LONG_MIN, LONG_MAX, ULONG_MAX);
+ printf("`float`s range from %e to %e\n", FLT_MIN, FLT_MAX);
+ printf("`double`s range from %e to %e\n", DBL_MIN, DBL_MAX);
+ return 0;
+}
79307c0a0197d20b3c1d92a9c391cd75731042&follow=1'>setup.py: Bump to alpha4 for PyPIzlg1-1/+1 2018-09-08cli: add '--raw' option to list commandzlg2-9/+45 2018-09-08Add remaining filters to vgstash packagezlg1-2/+11 2018-09-04Update LICENSE to match setup.pyzlg1-80/+67 2018-09-03Branch off from master with pytest, tox, clickzlg16-778/+779 2018-03-18Flesh out filter types and ownership statuszlg3-82/+144 2018-03-18README.mdown: break line correctlyzlg1-1/+1 2018-03-18add 'playlog' list filterzlg2-2/+9 2018-03-13Update helpers a bitzlg1-2/+9 2018-03-13Make VGSTASH_DB_LOCATION point to a filezlg2-21/+20 2016-11-18Remove settings from helpers.shZe Libertine Gamer1-5/+0 2016-11-15Correct phrasing in README.Ze Libertine Gamer1-4/+4 2016-11-13DerpZe Libertine Gamer1-0/+1 2016-11-03Improve error handling in shell scriptsZe Libertine Gamer4-3/+23 2016-10-24Correct run_again, add recursionZe Libertine Gamer1-0/+4 2016-10-21Add quotes to correct behavior for arglistZe Libertine Gamer1-1/+1 2016-10-14updater.sh: add recursion, error handlingZe Libertine Gamer1-43/+101 2016-10-14Correct pipe-handling behaviorZe Libertine Gamer1-1/+9 2016-10-12Clarify a method to move between platformsZe Libertine Gamer1-2/+5