diff --git a/notes/.obsidian/plugins/obsidian-to-anki-plugin/data.json b/notes/.obsidian/plugins/obsidian-to-anki-plugin/data.json index 2a07b09..82cf373 100644 --- a/notes/.obsidian/plugins/obsidian-to-anki-plugin/data.json +++ b/notes/.obsidian/plugins/obsidian-to-anki-plugin/data.json @@ -281,9 +281,9 @@ "_journal/2024-02-23.md": "219ce9ad15a8733edd476c97628b71fd", "_journal/2024-02/2024-02-22.md": "312e55d57868026f6e80f7989a889c2b", "c17/strings.md": "2da50edd26eae35c81f70e65bbd12d49", - "c17/index.md": "7662b066e7cf52e94d21fed57dfe227f", + "c17/index.md": "c96078cda31616017b0a6036ac87e60b", "c17/escape-sequences.md": "a8b99070336878b4e8c11e9e4525a500", - "c17/declarations.md": "9d0cf7a345d89b454447b3f66d4b7b64", + "c17/declarations.md": "2b61706906d8ae935e0b56e962ad2fa8", "algorithms/sorting/merge-sort.md": "6506483f7df6507cee0407bd205dbedd", "_journal/2024-02-24.md": "9bb319d5014caf962a9ce3141076cff4", "_journal/2024-02/2024-02-23.md": "0aad297148e8cc4058b48b7e45787ca7", @@ -534,7 +534,7 @@ "_journal/2024-06/2024-06-04.md": "52b28035b9c91c9b14cef1154c1a0fa1", "_journal/2024-06-06.md": "3f9109925dea304e7172df39922cc95a", "_journal/2024-06/2024-06-05.md": "b06a0fa567bd81e3b593f7e1838f9de1", - "set/relations.md": "fa91d0d77961f49651f7d9f5d4c392f5", + "set/relations.md": "feaa8115db02fbbda77b483c37f183ca", "_journal/2024-06-07.md": "795be41cc3c9c0f27361696d237604a2", "_journal/2024-06/2024-06-06.md": "db3407dcc86fa759b061246ec9fbd381", "_journal/2024-06-08.md": "b20d39dab30b4e12559a831ab8d2f9b8", @@ -710,13 +710,13 @@ "_journal/2024-08/2024-08-10.md": "08e7ea4a78c46645b93ec51e2372d04f", "_journal/2024-08-12.md": "8a37a2d1381f9d9e29d83031bad80dd0", "_journal/2024-08/2024-08-11.md": "acc91e07b43590e90846d2c936dcb3d5", - "c17/types.md": "2bca56b2d95cc358553fb798acde6522", + "c17/types.md": "941438a8f8377e348192d1822e765e40", "_journal/2024-08-14.md": "800650b9fa2f4445a174e0a547c2fa95", "_journal/2024-08/2024-08-13.md": "8b64225b06d1164a91176b123a3513a2", "_journal/2024-08/2024-08-12.md": "e57b03b929410f3111c894e43e1728ec", "_journal/2024-08-15.md": "fabf6e09bfd99cd180a4c674f83ebcb9", "_journal/2024-08/2024-08-14.md": "f7d1dede5ab6e4634ad9de3d3426c6f7", - "_journal/2024-08-16.md": "15fab7ec5b9dc08e4065a1bce88653c7", + "_journal/2024-08-16.md": "a25c680684bcffc6a38cebbb448d9d97", "_journal/2024-08/2024-08-15.md": "7c3a96a25643b62b0064bf32cb17d92f" }, "fields_dict": { diff --git a/notes/_journal/2024-08-16.md b/notes/_journal/2024-08-16.md index abf8b99..41ac6ff 100644 --- a/notes/_journal/2024-08-16.md +++ b/notes/_journal/2024-08-16.md @@ -8,4 +8,5 @@ title: "2024-08-16" - [ ] Sheet Music (10 min.) - [ ] Korean (Read 1 Story) -* Notes on [[relations#Preorders|preorders]] and [[relations#Partial Orders|partial orders]]. \ No newline at end of file +* Notes on [[relations#Preorders|preorders]] and [[relations#Partial Orders|partial orders]]. +* Details on C's [[c17/index|abstract state machine]] and [[types|integer types]]. \ No newline at end of file diff --git a/notes/c17/declarations.md b/notes/c17/declarations.md index 7b67934..59bb318 100644 --- a/notes/c17/declarations.md +++ b/notes/c17/declarations.md @@ -498,14 +498,6 @@ Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Program END%% -%%ANKI -Basic -Is declaration `char` signed or unsigned? -Back: This is implementation-dependent. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - %%ANKI Cloze {1:`float`} has {2:4} byte precision whereas {2:`double`} has {1:8} byte precision. @@ -703,211 +695,6 @@ Reference: Van der Linden, Peter. _Expert C Programming: Deep C Secrets_. Progra END%% -## Integer Literals - -Negative integer literals are typed in a counterintuitive way. When the compiler sees a number of form `-X`, the type of `X` is determined *before* being negated. Promotion rules are as follows: - -Decimal | Other Bases ------------ | -------------------- -`int` | `int` -`long` | `unsigned` -`long long` | `long` -`-` | `unsigned long` -`-` | `long long` -`-` | `unsigned long long` - -%%ANKI -Basic -How does the compiler process integer literal `-X`? -Back: By first determining the type of `X` and then negating the value. -Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -What integer literals are guaranteed `signed`? -Back: Decimal integer constants. -Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -How do we specify an octal integer literal? -Back: Prepend the literal with a `0`. -Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -Why avoid negative octal integer literals? -Back: Depending on value, the resulting type may be `unsigned`. -Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -How do we specify a hexadecimal integer literal? -Back: Prepend the literal with a `0x` or `0X`. -Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Cloze -Octal literals are to {`0`} whereas hexadecimal literals are to {`0x`/`0X`}. -Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -How might C dangerously interpret a negative hexadecimal integer literal? -Back: Depending on the value, the resulting type may be `unsigned`. -Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -Which header file contains `INT_MAX`? -Back: `` -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Cloze -{`INT_MAX`} is to `signed` whereas {`UINT_MAX`} is to `unsigned`. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -How does `` define `INT_MIN`? -Back: As `(-INT_MAX - 1)`. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -*Why* is `INT_MIN` defined as `(-INT_MAX - 1)` instead of directly as e.g. `-2147483648`? -Back: Because `2147483648` (without `-`) would be sized as a non-`int` before being negated. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Cloze -`INT_MAX` is to {``} whereas `INT32_MAX` is to {``}. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -What suffix can be used to denote an `unsigned` integer literal? -Back: Case-insensitive `U`. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -What suffix can be used to denote a `long` integer literal? -Back: Case-insensitive `L`. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -What suffix can be used to denote a `long long` integer literal? -Back: Case-insensitive `LL`. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -What suffix can be used to denote an `unsigned long long` integer literal? -Back: Case-insensitive `ULL`. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -In what order does C cast size and "signedness"? -Back: C casts size then signedness. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -In what order does C cast "signedness" and size? -Back: C casts size then signedness. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -Given `short sx`, cast `(unsigned) sx` is more explicitly written as what other sequence of casts? -Back: `(unsigned) (int) sx` -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -Given `short sx`, are the following two lines equivalent? -```c -(unsigned) sx -(unsigned) (int) sx -``` -Back: Yes. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -Given `short sx`, are the following two lines equivalent? -```c -(unsigned) sx -(unsigned) (unsigned short) sx -``` -Back: No. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -Given `short sx`, why is the following not an identity? -```c -(unsigned) sx = (unsigned) (unsigned short) sx -``` -Back: `(unsigned) sx` casts size before "signedness". -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - -%%ANKI -Basic -What does "signedness" of a variable refer to? -Back: Whether the variable was declared `signed` or `unsigned`. -Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. - -END%% - ## Bibliography * Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. diff --git a/notes/c17/index.md b/notes/c17/index.md index f135687..41a288f 100644 --- a/notes/c17/index.md +++ b/notes/c17/index.md @@ -8,14 +8,59 @@ tags: ## Overview -An **object** is a region of data storage in the execution environment, the contents of which can represent **values**. We say an object type is **complete** if there is sufficient information to determine the size of objects of that type. Otherwise we say it is **incomplete**. +> A C program can be seen as a sort of machine that manipulates values: the particular values that variables of the program have at a given time, and also intermediate values that are the result of computed expressions. -An **lvalue** is an expression (with non-`void` object type) that potentially designates an object. An **rvalue** is the "value of the expression." +This quote describes C's **abstract state machine**. Whatever instructions a C program compiles down to is "unimportant" provided that all **observable states** are correctly reproduced. This is the essence of optimization. + +%%ANKI +Basic +What feature of C's abstract state machine makes C performant? +Back: It enables optimization. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +C can compile into any sequence of instructions provided what holds? +Back: All observable states are correctly reproduced. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Why is C's abstract state machine called the way it is? +Back: Compilers are free to realize the state machine however they see fit. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +What three components make up C's abstract state machine? +Back: Values, types, and binary representations. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Cloze +In C's abstract state machine, {binary representations} describe {types} which describe {values}. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +## Values + +An **object** is a region of data storage in the execution environment, the contents of which can represent **values**. An **lvalue** is an expression (with non-`void` object type) that potentially designates an object. An **rvalue** is the "value of the expression." + +The notion of a value in C is an abstract entity. It exists beyond the program or the representation of the value in the program. For example, the value `0` (no matter how its represented) added to variable `x` should always yield result `x` regardless of platform. %%ANKI Basic What does an object refer to? -Back: A region of data storage in the execution environment, the contents of which can represent values. +Back: A region of data storage in the execution environment. Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). END%% @@ -28,6 +73,22 @@ Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70 END%% +%%ANKI +Basic +Why does Gustedt refer to values as abstract entities? +Back: A value exists beyond a program or any particular representation. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +How does Gustedt distinguish the data of a program execution from values? +Back: The data is the set of values of all objects at a given moment. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + %%ANKI Cloze A {value} refers to the contents of an {object} when interpreted as having a specific type. @@ -35,54 +96,6 @@ Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70 END%% -%%ANKI -Basic -Types are partitioned into what two categories? -Back: Object types and function types. -Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). - -END%% - -%%ANKI -Basic -What is an object type? -Back: A type that describes objects. -Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). - -END%% - -%%ANKI -Basic -What is a function type? -Back: A type that describes functions. -Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). - -END%% - -%%ANKI -Basic -What two parts characterize a function type? -Back: The return type and the number/types of its parameters. -Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). - -END%% - -%%ANKI -Basic -What does it mean for an object type to be complete? -Back: There is sufficient information to determine the size of objects of that type. -Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). - -END%% - -%%ANKI -Basic -What does it mean for an object type to be incomplete? -Back: There is insufficient information to determine the size of objects of that type. -Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). - -END%% - %%ANKI Basic What is an lvalue? @@ -115,22 +128,6 @@ Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70 END%% -%%ANKI -Basic -What object type can an lvalue *not* have? -Back: `void` -Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). - -END%% - -%%ANKI -Basic -What object type can an lvalue have? -Back: Any object type other than `void`. -Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). - -END%% - %%ANKI Basic Can an lvalue designate an object? @@ -336,6 +333,67 @@ Reference: ISO: Programming Languages - C,” April 12, 2011, [https://port70.ne END%% +## Types + +Types are additional properties that C associates with values. All values have a type that is statically determined and all possible operations on a value are determined by its type. + +Types are categorized as function types and object types. An object type is **complete** if there is sufficient information to determine the size of objects of that type. Otherwise we say it is **incomplete**. + +%%ANKI +Cloze +Possible operations on a {value} are determined by its {type}. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Types are partitioned into what two categories? +Back: Object types and function types. +Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). + +END%% + +%%ANKI +Basic +What is an object type? +Back: A type that describes objects. +Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). + +END%% + +%%ANKI +Basic +What is a function type? +Back: A type that describes functions. +Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). + +END%% + +%%ANKI +Basic +What two parts characterize a function type? +Back: The return type and the number/types of its parameters. +Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). + +END%% + +%%ANKI +Basic +What does it mean for an object type to be complete? +Back: There is sufficient information to determine the size of objects of that type. +Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). + +END%% + +%%ANKI +Basic +What does it mean for an object type to be incomplete? +Back: There is insufficient information to determine the size of objects of that type. +Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). + +END%% + %%ANKI Basic Does `x` have complete or incomplete object type in the following? @@ -369,6 +427,72 @@ Reference: ISO: Programming Languages - C,” April 12, 2011, [https://port70.ne END%% +%%ANKI +Basic +What object type can an lvalue *not* have? +Back: `void` +Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). + +END%% + +%%ANKI +Basic +What object type can an lvalue have? +Back: Any object type other than `void`. +Reference: “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). + +END%% + +## Representation + +The **binary representation** of a type is the model used to represent values of said type on a given platform. The **object representation** of a type determines how values are stored in memory, disk, etc. + +%%ANKI +Basic +What is the binary representation of a type? +Back: The model used to represent values of the type on a given platform. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +What is the binary representation of a value? +Back: N/A. Binary representations describe types not values. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +What is the object representation of a type? +Back: How a value of a given type is actually stored in memory, disk, etc. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Cloze +A {type}'s {binary representation} determines the results of all operations. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Why does Gustedt refer to binary representations as abstract entities? +Back: Binary representations don't completely determine how values are stored in memory. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Cloze +A {binary} representation is abstract whereas an {object} representation is concrete. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + ## Bibliography * “ISO: Programming Languages - C,” April 12, 2011, [https://port70.net/~nsz/c/c11/n1570.pdf](https://port70.net/~nsz/c/c11/n1570.pdf). diff --git a/notes/c17/types.md b/notes/c17/types.md index 4ff53fe..57ba2a9 100644 --- a/notes/c17/types.md +++ b/notes/c17/types.md @@ -6,4 +6,420 @@ tags: - c17 --- -## Overview \ No newline at end of file +## Overview + +C has a series of basic types and means of constructing derived types from them. + +## Integers + +Type `char` is special since it can be signed or unsigned depending on platform. Keep in mind regardless of its signedness, it is still considered a distinct type from both the `unsigned char` and `signed char` type. + +%%ANKI +Basic +Is declaration `char` signed or unsigned? +Back: This is implementation-dependent. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +**Narrow types** cannot be used directly in arithmetic. Instead they are first promoted to a wider type. On almost every system, this promotion will be to a `signed int` of the same value, regardless of the signedness of the narrow type itself. + +%%ANKI +Basic +Why are narrow types named the way they are? +Back: They are considered to small to be used directly in arithmetic expressions. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Signed narrow types are usually promoted to what larger type? +Back: A `signed int`. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Unsigned narrow types found are usually promoted to what larger type? +Back: A `signed int`. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +### Unsigned + +These correspond to nonnegative integer values. + +| Name | Narrow | Rank | +| -------------------- | ------ | ---- | +| `bool` | Yes | 0 | +| `char` (maybe) | Yes | 1 | +| `unsigned char` | Yes | 1 | +| `unsighed short` | Yes | 2 | +| `unsigned int` | No | 3 | +| `unsigned long` | No | 4 | +| `unsigned long long` | No | 5 | + +%%ANKI +Basic +Which basic unsigned type has the smallest rank? +Back: `bool` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which unsigned type next succeeds `bool` in rank? +Back: `unsigned char` and (maybe) `char`. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which unsigned type next succeeds `unsigned char` in rank? +Back: `unsigned short` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which unsigned type next succeeds `unsigned short` in rank? +Back: `unsigned int` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which unsigned type next succeeds `unsigned int` in rank? +Back: `unsigned long` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which unsigned type next succeeds `unsigned long` in rank? +Back: `unsigned long long` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which unsigned type next succeeds `unsigned long long` in rank? +Back: N/A. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which unsigned narrow type has the highest rank? +Back: `unsigned short` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which unsigned non-narrow type has the smallest rank? +Back: `unsigned int` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +### Signed + +These correspond to possibly negative integer values. + +| Name | Narrow | Rank | +| -------------------- | ------ | ---- | +| `char` (maybe) | Yes | 1 | +| `signed char` | Yes | 1 | +| `signed short` | Yes | 2 | +| `signed int` | No | 3 | +| `signed long` | No | 4 | +| `signed long long` | No | 5 | +| `float` | - | - | +| `double` | - | - | +| `long double` | - | - | + +%%ANKI +Basic +Which basic signed type has the smallest rank? +Back: `signed char` and (maybe) `char`. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which signed type succeeds `signed char` in rank? +Back: `signed short` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which signed type succeeds `signed short` in rank? +Back: `signed int` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which signed type succeeds `signed int` in rank? +Back: `signed long` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which signed type succeeds `signed long` in rank? +Back: `signed long long` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which signed type succeeds `signed long long` in rank? +Back: N/A. +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which signed narrow type has the highest rank? +Back: `signed short` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +%%ANKI +Basic +Which signed non-narrow type has the smallest rank? +Back: `signed int` +Reference: Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020). + +END%% + +### Literals + +Negative integer literals are typed in a counterintuitive way. When the compiler sees a number of form `-X`, the type of `X` is determined *before* being negated. Promotion rules are as follows: + +| Decimal | Oct/Hex | +| ----------- | -------------------- | +| `int` | `int` | +| `long` | `unsigned` | +| `long long` | `long` | +| `-` | `unsigned long` | +| `-` | `long long` | +| `-` | `unsigned long long` | + +%%ANKI +Basic +How does the compiler process integer literal `-X`? +Back: By first determining the type of `X` and then negating the value. +Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +What integer literals are guaranteed `signed`? +Back: Decimal integer constants. +Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +How do we specify an octal integer literal? +Back: Prepend the literal with a `0`. +Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +Why avoid negative octal integer literals? +Back: Depending on value, the resulting type may be `unsigned`. +Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +How do we specify a hexadecimal integer literal? +Back: Prepend the literal with a `0x` or `0X`. +Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Cloze +Octal literals are to {`0`} whereas hexadecimal literals are to {`0x`/`0X`}. +Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +How might C dangerously interpret a negative hexadecimal integer literal? +Back: Depending on the value, the resulting type may be `unsigned`. +Reference: Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +Which header file contains `INT_MAX`? +Back: `` +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Cloze +{`INT_MAX`} is to `signed` whereas {`UINT_MAX`} is to `unsigned`. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +How does `` define `INT_MIN`? +Back: As `(-INT_MAX - 1)`. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +*Why* is `INT_MIN` defined as `(-INT_MAX - 1)` instead of directly as e.g. `-2147483648`? +Back: Because `2147483648` (without `-`) would be sized as a non-`int` before being negated. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Cloze +`INT_MAX` is to {``} whereas `INT32_MAX` is to {``}. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +What suffix can be used to denote an `unsigned` integer literal? +Back: Case-insensitive `U`. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +What suffix can be used to denote a `long` integer literal? +Back: Case-insensitive `L`. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +What suffix can be used to denote a `long long` integer literal? +Back: Case-insensitive `LL`. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +What suffix can be used to denote an `unsigned long long` integer literal? +Back: Case-insensitive `ULL`. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +In what order does C cast size and "signedness"? +Back: C casts size then signedness. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +In what order does C cast "signedness" and size? +Back: C casts size then signedness. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +Given `short sx`, cast `(unsigned) sx` is more explicitly written as what other sequence of casts? +Back: `(unsigned) (int) sx` +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +Given `short sx`, are the following two lines equivalent? +```c +(unsigned) sx +(unsigned) (int) sx +``` +Back: Yes. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +Given `short sx`, are the following two lines equivalent? +```c +(unsigned) sx +(unsigned) (unsigned short) sx +``` +Back: No. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +Given `short sx`, why is the following not an identity? +```c +(unsigned) sx = (unsigned) (unsigned short) sx +``` +Back: `(unsigned) sx` casts size before "signedness". +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +%%ANKI +Basic +What does "signedness" of a variable refer to? +Back: Whether the variable was declared `signed` or `unsigned`. +Reference: Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. + +END%% + +## Bibliography + +* Bryant, Randal E., and David O'Hallaron. *Computer Systems: A Programmer's Perspective*. Third edition, Global edition. Always Learning. Pearson, 2016. +* Jens Gustedt, _Modern C_ (Shelter Island, NY: Manning Publications Co, 2020).