notebook/notes/c17/declarations.md

17 KiB

title TARGET DECK FILE TAGS tags
Declarations Obsidian::STEM c17
c17

Overview

C declarations were designed so that the declaration of an object looks like the use of the object. This isn't quite true - keywords like volatile and const only exist in declarations - but for the most part, this philosophy can be leveraged to read C declarations.

Declarators

A declarator in C is roughly an identifier along with pointers, function brackets, or array indications. Pointers will look like one of:

  • *
  • * const
  • * volatile
  • * const volatile
  • * volatile const

whereas direct declarators will look like one of:

  • identifier
  • identifier[size]
  • identifier(args)
  • (declarator)

Declarations

A declaration is then at least one type-specifier (e.g. signed short), storage class (e.g. static), and/or type qualifier (e.g. const) followed by one or more declarators.

Type Specifiers

Signed Unsigned 32-bit 64-bit
signed char unsigned char 1 1
short unsigned short 2 2
int unsigned 4 4
long unsigned long 4 8
long long unsigned long long 8 8
char * - 4 8
float - 4 4
double - 8 8

Fixed width data integral types (e.g. int32_t) can be found by including <stdint.h>.

%%ANKI Cloze The {<stdint.h>} header file contains {fixed width data integral types}. 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 INT32_MAX? Back: <stdint.h> 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 the "width" of an integer type refer to? Back: The number of bits used to represent its value. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

END%%

%%ANKI What two variants does a C integral type declaration have? Back: Signed and 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 What does it mean for an integer to be "signed"? Back: It can represent negative, zero, and positive values. Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016. END%%

%%ANKI What does it mean for an integer to be "unsigned"? Back: It can only represent nonnegative values. 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 large is a word? Back: This is a machine-dependent value. 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 word sizes are typical nowadays? Back: 32- and 64-bit word sizes. 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 char typically represents {1} byte(s) on a 64-bit platform. 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 short typically represents {2} byte(s) on a 64-bit platform. 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 typically represents {4} bytes(s) on a 64-bit platform. 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 unsigned typically represents {4} bytes(s) on a 64-bit platform. 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 long typically represents {8} bytes(s) on a 64-bit platform. 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 long long typically represents {8} bytes(s) on a 64-bit platform. 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 distinguishes long from long long? Back: long longs are guaranteed to be at least 64-bit wide. 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 there both a long and long long? Back: long longs are at least 64-bit wide, even on 32-bit platforms. 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 char * typically represents {8} bytes(s) on a 64-bit platform. 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 float typically represents {4} bytes(s) on a 64-bit platform. 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 double typically represents {8} bytes(s) on a 64-bit platform. 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 Is declaration int signed or unsigned? Back: Signed. 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 is declaration unsigned written more precisely? Back: unsigned int. 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 Is declaration long signed or unsigned? Back: Signed. 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 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. 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 The C standard defines {lower} bounds on numeric ranges of data types. 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 The C standard does not define {1:upper} bounds on numeric ranges of data types (except for {1:fixed-size} types). Reference: Bryant, Randal E., and David O'Hallaron. Computer Systems: A Programmer's Perspective. Third edition, Global edition. Always Learning. Pearson, 2016.

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: <limits.h> 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 <limits.h> 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 {<limits.h>} whereas INT32_MAX is to {<stdint.h>}. 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?

(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?

(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?

(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%%

Pointers

Pointers have the same size as the machine's word size since it should be able to refer to any virtual address.

%%ANKI Basic Why does a pointer's size match the machine's word size? Back: Because it should be able to refer to any virtual address. 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.
  • Peter Van der Linden and Peter VanDerLinden, Expert C Programming: Deep C Secrets, Programming Languages / C (Mountain View, Cal.: SunSoft Pr, 1994).