449,022 Members | 931 Online Need help? Post your question and get tips & solutions from a community of 449,022 IT Pros & Developers. It's quick & easy.

# Sign preserving Vs value preserving

 P: n/a Dear all, I was going through the book "C a software engineering approach by darnell & Margolis" there was a section named sign preserving vs value preserving it is as follows sign preserving rule:- when signed and un signed objects meet in an expression, the result is always unsigned ex:- if a is an unsigned short whose value is 2,then the expression a - 3 evaluates to a very large un signed value rather than the signed value of -1 value preserving rule:- This method converts unsigned chars and unsigned shorts to int,assuming that the int type is larger than unsigned char and unsigned short respectively. if int is not larger the object is converted to unsigned int assuming 16-bit shorts and 32-bit ints in the previous example, a would be converted to int rather than unsigned int,so the result of the expression would be -1 note that the difference between sign-preserving and value-preserving rules only becomes manifest when an unsigned type is shorter than int. if both operands are unsigned ints, the result is unsigned, so that the expression 2u-3u always evaluates to a large unsigned value 1) how valid is the above explanation? 2)is there any implementation where the int type is smaller in size when compared to unsigned short and unsigned char? 3)Does the condition sizeof(short) <= sizeof(int) <= sizeof(long) always holds in ANSI-C ? or is it true for unsigned values ? Dec 5 '07 #1
3 Replies

 P: n/a On Dec 5, 1:44 pm, sophia.ag...@gmail.com wrote: Dear all, I was going through the book "C a software engineering approach by darnell & Margolis" there was a section named sign preserving vs value preserving it is as follows sign preserving rule:- when signed and un signed objects meet in an expression, the result is always unsigned true if both operands are unsigned ints, the result is unsigned, so that the expression 2u-3u always evaluates to a large unsigned value To be precise, its value is equal to UINT_MAX 1) how valid is the above explanation? valid. 2)is there any implementation where the int type is smaller in size when compared to unsigned short and unsigned char? no, because your 3) is true 3)Does the condition sizeof(short) <= sizeof(int) <= sizeof(long) always holds in ANSI-C ? or is it true for unsigned values ? yes. Dec 5 '07 #2

 P: n/a vipps...@gmail.com wrote: sophia.ag...@gmail.com wrote:> I was going through the book "C a software engineering approach by darnell & Margolis" there was a section named sign preserving vs value preserving it is as follows sign preserving rule:- when signed and un signed objects meet in an expression, the result is always unsigned true No, it's false. Let's look at the OP's (snipped) example. "ex:- if a is an unsigned short whose value is 2, then the expression a - 3 evaluates to a very large un signed value rather than the signed value of -1" It depends on whether an unsigned short promotes to int or to unsigned int, and that depends on whether unsigned short values can be represented by an int. If USHRT_MAX <= INT_MAX, then the value is -1, otherwise unsigned short promotes to unsigned int and the value is UINT_MAX. if both operands are unsigned ints, the result is unsigned, Unless by ints you mean integers. Arithmetic on two unsigned short values may be signed or unsigned for reasons stated above. so that the expression 2u-3u always evaluates to a large unsigned value To be precise, its value is equal to UINT_MAX 1) how valid is the above explanation? valid. No, it's invalid. If you've been fooled it's probably because unsigned short has the same width as unsigned int on the implementations you've seen. 2)is there any implementation where the int type is smaller in size when compared to unsigned short and unsigned char? No addressable type is smaller than a character type. The standard has rules on the values that are representable by types of the same signedness but different rank. It has rules that the unsigned integer must be able to represent all the non-negative values of it's signed counterpart (same rank.) It does not talk about the byte size of the representations beyond imposing implicit minimums based on how many value (and sign) bits are required to support the minimum range. no, because your 3) is true No, 3) is not necessarily true. 3)Does the condition sizeof(short) <= sizeof(int) <= sizeof(long) [Assuming a mathematical relation, rather than C's <=...] always holds in ANSI-C ? or is it true for unsigned values ? yes. No. The standard allows sizeof(short) sizeof(int). All it requires is that SHRT_MAX <= INT_MAX and INT_MIN <= SHRT_MIN. You're not likely to find an implementation where shorts are larger than ints, but the standard doesn't exclude them. -- Peter Dec 5 '07 #3

 P: n/a what about this result when an integer value x is converted to a smaller unsigned integer type, the result is the non negative remainder of x/(U_MAX+1) where U_MAX is the largest number that can be represented in the shorter unsigned type. i checked it using the following program #include #include #include int main(int argc, char* argv[]) { unsigned short j; j = 71124; printf("\n USHRT_MAX = %d",USHRT_MAX); printf("\n j = %d",j); printf("\n ......... = %d",(71124) % (USHRT_MAX+1)); puts(""); return(EXIT_SUCCESS); } I got the o/p as USHRT_MAX = 65535 j = 5588 ......... = 5588 Dec 7 '07 #4

### This discussion thread is closed

Replies have been disabled for this discussion. 