Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| language:expressions [2024/07/19 14:22] – [Expressions in CHP] rajit | language:expressions [2025/04/21 17:39] (current) – [Structure references] rajit | ||
|---|---|---|---|
| Line 55: | Line 55: | ||
| * Each variable has the bit-width specified by its type. | * Each variable has the bit-width specified by its type. | ||
| - | * A constant uses the minimum number of bits needed to represent it. Note that a negative constant is assumed to be a two's complement value, an its bit-width is determined in the same way. | + | * A constant uses the minimum number of bits needed to represent it. Note that a negative constant is assumed to be a two's complement value, an its bit-width is determined in the same way. If you are unsure about what is going to happen and want to control the bit-width of a constant, '' |
| * For unary operators, the bit-width of the result is the same as the bit-width of the argument | * For unary operators, the bit-width of the result is the same as the bit-width of the argument | ||
| * For binary operators and ternary operators where the result is an integer, let //left// be the bit-width of the left-hand side of the operator, and //right// be the bit-width of the right hand side. There are six categories of result bit-widths: | * For binary operators and ternary operators where the result is an integer, let //left// be the bit-width of the left-hand side of the operator, and //right// be the bit-width of the right hand side. There are six categories of result bit-widths: | ||
| Line 76: | Line 76: | ||
| - //left// + 2^//right// - 1 | - //left// + 2^//right// - 1 | ||
| * left shift ''<<'' | * left shift ''<<'' | ||
| - | * For concatenation, | + | * For concatenation, |
| + | * For bitfield extraction, the bitwidth is determined by the number of bits extracted. | ||
| + | |||
| + | ==== Idiosyncrasies ==== | ||
| While these bit-width rules are nice because you never lose bits, they can have some unexpected consequences. One of the not-so-nice effects of these rules is that, technically, | While these bit-width rules are nice because you never lose bits, they can have some unexpected consequences. One of the not-so-nice effects of these rules is that, technically, | ||
| Line 182: | Line 185: | ||
| } | } | ||
| } | } | ||
| + | </ | ||
| + | |||
| + | ===== Structure references ===== | ||
| + | |||
| + | Functions can return [[language: | ||
| + | |||
| + | <code act> | ||
| + | deftype mystruct (int a, b) | ||
| + | { | ||
| + | | ||
| + | function getsum() : int | ||
| + | { | ||
| + | chp { | ||
| + | self := a + b | ||
| + | } | ||
| + | } | ||
| + | | ||
| + | { | ||
| + | chp { | ||
| + | self.a := a + 1; | ||
| + | self.b := b + 1 | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | We can have expressions of the following form: | ||
| + | |||
| + | <code act> | ||
| + | mystruct s; | ||
| + | int a; | ||
| + | ... | ||
| + | chp { | ||
| + | ... | ||
| + | a := s.addone().getsum(); | ||
| + | ... | ||
| + | } | ||
| </ | </ | ||