From: "Damian Yerrick" Newsgroups: comp.os.msdos.djgpp Subject: Re: What's this? A bug? Date: Wed, 6 Oct 1999 20:09:54 -0500 Organization: Rose-Hulman Institute of Technology Lines: 69 Message-ID: <7tgs10$dhd$1@solomon.cs.rose-hulman.edu> References: NNTP-Posting-Host: yerricde.laptop.rose-hulman.edu X-Trace: solomon.cs.rose-hulman.edu 939258720 13869 137.112.205.146 (7 Oct 1999 01:12:00 GMT) X-Complaints-To: news AT cs DOT rose-hulman DOT edu NNTP-Posting-Date: 7 Oct 1999 01:12:00 GMT X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 5.00.2314.1300 X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2314.1300 To: djgpp AT delorie DOT com DJ-Gateway: from newsgroup comp.os.msdos.djgpp Reply-To: djgpp AT delorie DOT com Viktor Bresan wrote in message news:MO8+3UJ05Q5a092yn AT jagor DOT srce DOT hr... > Here is the code which counts the number of nonzero bits in int value. > It works fine until you enter negativ value, e.g. when i enter value -1 > it counts 32 nonzero bits (although we all know that int has only 16 bits)!? "We all know" that int is implementation defined to match the word size of the system. > The same code compiled under the BC++ 3.1 acts normal > (under 16 bits counted for each negative value). The BC++ 3.1 implementation defines an int as 16 bits because the 8086 processor defined an int as 16 bits, the size that would fit into register AX. However, DJGPP is a 32-bit compiler, and 32-bit compilers define int as 32 bits, the size that fits into register EAX. Try looking at the value of sizeof(int) in each of your compilers. > Am i doing something wrong? What happends here? You're just writing Borland C not portable C. If you want a 16-bit integer, then use the type 'short'. I challenge c.o.m.d readers to find *one* C/C++ compiler on *any* platform that defines 'short' as anything other than a 16-bit integer. Change all instances of 'short' to 'int' and you'll be fine. Oh, BTW, a cute symbol for 'cut' is >8 >8 >8 >8 >8 >8 8< 8< 8< 8< 8< 8< > #include > #include > > > char CntBits(int val) > { char ret_val; > int maska; > > ret_val = 0; > maska = 1; > while(maska) > { > if(val & maska) > ret_val++; > > maska <<= 1; > } > > return (ret_val); > } > > int main(/*int argc, char *argv[]*/) > { char CntBits(int); > int val; > > clrscr(); > printf("Enter int value: "); > scanf("%i",&val); > > printf("%i nonzero bit(s)!",CntBits(val)); > > return (0); > }