The Gateway to Computer Science Excellence
First time here? Checkout the FAQ!
+40 votes

Consider the following C program.


void printlength(char *s, char *t) {
    unsigned int c=0;
    int len = ((strlen(s) - strlen(t)) > c) ? strlen(s) : strlen(t);
    printf("%d\n", len);

void main() {
    char *x = "abc";
    char *y = "defgh";

Recall that $strlen$ is defined in $string.h$ as returning a value of type $size\_t$, which is an unsigned int. The output of the program is __________ .

asked in Programming by Veteran (86.9k points)
edited by | 5.1k views

Let us assume our int  is of 3 bits then 

value of binary 110  in unsigned int will be 6.( which is > 0)

value of binary 110  in signed int (or int ) will be -2. (In C int is represented in  2's compliment  representation)

One more thing -->

As you can see, (unsigned)0 - (unsigned)1 equals -1 modulo UINT_MAX+1, or in other words, UINT_MAX.

Refer ->

5 Answers

+46 votes
Best answer
$(strlen(s)- strlen(t)) = 3-5 =-2$

But in C, when we do operation with two unsigned integers, result is also unsigned. ($strlen$ returns $size\_t$ which is unsigned in most systems). So, this result "$-2$" is treated as unsigned and its value is $INT\_MAX - 2$ (not sure about all systems, but at least on systems using $2$'s complement representation). Now, the comparison is between this large number and another unsigned number $c$ which is $0$. So, the comparison return TRUE here.

Even if '$c$' is declared as "$int$", while doing an operation with an unsigned int, it gets promoted to unsigned int and we get the same result.

Hence $(strlen(s)- strlen(t)) >0$ will return $1$ on execution thus the conditional operator will return the true statement which is $strlen(abc) =3$.

Ans should be $3$.
answered by Loyal (7.9k points)
edited by
You are correct.

the definition of strlen function is given in string.h header file and the output of the strlen function retrun a value of type size_t form and size_t is a unsigned integer . so in each case  ((strlen(s) - strlen(t)) > c) return a unsigned value, it is not matter that whether c is given unsigned or not.

if c is not given unsgined then answer also will be same .


Binary operations between different integral types are performed within a "common" type defined by so called usual arithmetic conversions (see the language specification,

Reference :

C Language Specification URL :

So here (strlen(s)-strlen(t)) which is coming as -2 is converted to first unsigned int (which evaluates to INT_MAX-2) and then it is compared with c(c being unsigned int) which is 0.

The result of the boolean expression in program goes true and strlen(s) is selected for output which prints output as 3.


IIn above case it returns -2 .I think it should return 2 .Do not understand why this is happening .We discussed that arithmetic calcuation between unsigned is always positive.

size_t strlen( const char *s );

Thanx that was an eye opener


Here, we compare length of pointer because s and t are char type pointer. But all type of pointer have same size then why we get length of string and when i try to print strlen(*y) i got error . why?

could you explain ?


You should try this code. You were printing with %d which converts c to signed integer. So pick %ld which is big enough to take the large unsigned value that c has.

void main()
    unsigned int a=3, b=5,c;
    long d=c;
ToBONGBIRDIE .. i appreciate your information regarding strlen() but I have a doubt ..

you said "strlen(s) - strlen(t) will yield unsigned-unsigned= unsigned".

Now  strlen(s) & strlen(t) produces separately positive values 3 and 5 respectively. Now as both 3 & 5 are unsigned... so (3-5) is not resulting (-2) ?

If it resulting (-2) then how that "unsigned int c" does not matter in the question?

if you can please reply..
@Arjun sir

Shouldn't it be

-2 mod (INT_MAX +1) = INT_MAX - 1 and   NOT INT_MA X - 2 , Considering 2's complement representation.

why after removing unsigned it is still  showing output as 3 .?

+7 votes

Suppose  numbes are represented in 2's complement.

Then ,(strlen(s)- strlen(t)) gives -2.

Because it is unsigned ,its binary format will be in 2's complement 

+2n-1-2 on n bit machine.

Just care here about that it will be positive and  condition become true,and length of first string gets printed which is 3.

answered by Active (4k points)
+3 votes
answered by (95 points)

This is because of the unsigned int property which causes negative values to overflow into a large positive number
see this code snippet for better understanding


void printlength(char *s, char *t) {
    unsigned int c = 0;
    int len = ((strlen(s) - strlen(t)) > c )? strlen(s) : strlen(t);
    printf("using standard int = %d\n", (strlen(s) - strlen(t)));
    printf("using unsigned int = %u\n", (strlen(s) - strlen(t)));
    printf("%d\n", len);

void main() {
    char *x = "abc";
    char *y = "defgh";

+1 vote

here it is taking two list of two legth

code like:

is the length of first list > lenght of 2nd list

then-> return the First list length


return 2nd list length

it is simply returning the length of larger string 

here it is 5

so 5 should be the answer

answered by Boss (18.4k points)
I also thought the same Uddlpto, I ran it on Ideone, it gave 3.
oh! again mark lost
I still don't understand how -2>0
but as per code it should be 5
–1 vote
5 is the answer because ((3-5)>0 ) return 0 so len=strlen(t).


int main(){
return 0;

[email protected]:~/socket_programming$ gcc compare.c
[email protected]:~/socket_programming$ ./a.out
answered by (293 points)
Good, but what you just answered showed a different thing - integer constants by default is signed in C.

Related questions

Quick search syntax
tags tag:apple
author user:martin
title title:apple
content content:apple
exclude -tag:apple
force match +apple
views views:100
score score:10
answers answers:2
is accepted isaccepted:true
is closed isclosed:true

36,202 questions
43,662 answers
42,944 users