difference between ~0U and ~0 | C Programming (2024)

  • Forums
  • Archive
  • Archive
  • C Programming
  • Thread startersomenath
  • Start dateMar 4, 2012

S

somenath

  • Mar 4, 2012
  • #1

Hello All,

I am confused with the behaviour of the following program
#include<stdio.h>

int main(void)
{
printf("\n~0U = %d",~0U);
printf("\n~0 = %d",~0);
printf("\n~0U>>1 = %d",~0U>>1);
printf("\n~0>>1 = %d\n",~0>>1);
return 0;
}

==========
Output
=========

~0U = -1
~0 = -1
~0U>>1 = 2147483647
~0>>1 = -1
===========
According to my understanding ~0 is -1.So I will get all bit 1 as a
result of ~0 in 2's complement system.

So the first two line of output saying ~0 is same as ~0U. Then why
there is difference in the output of ~0U>>1 and ~0>>1 ?
please provide some input.

S

Stephen Sprunk

  • Mar 4, 2012
  • #2

Hello All,

I am confused with the behaviour of the following program
#include<stdio.h>

int main(void)
{
printf("\n~0U = %d",~0U);

~0U has type (unsigned int); the appropriate format specifier is %u, not %d.

printf("\n~0 = %d",~0);

~0 has type (int), so %d is correct.

printf("\n~0U>>1 = %d",~0U>>1);

~0U>>1 has type (unsigned int); the appropriate format specifier is %u,
not %d.

printf("\n~0>>1 = %d\n",~0>>1);

~0>>1 has type (int), so %d is correct.

return 0;
}

==========
Output
=========

~0U = -1
~0 = -1
~0U>>1 = 2147483647
~0>>1 = -1
===========
According to my understanding ~0 is -1.

That is true for if the zero's type is signed. However, "0U" is
unsigned, so the result of the ~ operator cannot be negative.

So I will get all bit 1 as a result of ~0 in 2's complement system.

That is an implementation detail and will only confuse you at this point.

So the first two line of output saying ~0 is same as ~0U.

Perhaps on your system, but your code invokes undefined behavior by
using the wrong format specifier, so anything is possible.

Then why there is difference in the output of ~0U>>1 and ~0>>1 ?

Fix the bugs in your code and you'll see that you're asking the wrong
questions.

S

B

BGB

  • Mar 4, 2012
  • #3

Hello All,

I am confused with the behaviour of the following program
#include<stdio.h>

int main(void)
{
printf("\n~0U = %d",~0U);
printf("\n~0 = %d",~0);
printf("\n~0U>>1 = %d",~0U>>1);
printf("\n~0>>1 = %d\n",~0>>1);
return 0;
}

==========
Output
=========

~0U = -1
~0 = -1
~0U>>1 = 2147483647
~0>>1 = -1
===========
According to my understanding ~0 is -1.So I will get all bit 1 as a
result of ~0 in 2's complement system.

So the first two line of output saying ~0 is same as ~0U. Then why
there is difference in the output of ~0U>>1 and ~0>>1 ?
please provide some input.

because ~0U is unsigned, but ~0 is signed.
'>>' does different things for signed and unsigned values.

B

Ben Bacarisse

  • Mar 4, 2012
  • #4

somenath said:

I am confused with the behaviour of the following program
#include<stdio.h>

int main(void)
{
printf("\n~0U = %d",~0U);
printf("\n~0 = %d",~0);
printf("\n~0U>>1 = %d",~0U>>1);
printf("\n~0>>1 = %d\n",~0>>1);
return 0;
}

==========
Output
=========

~0U = -1
~0 = -1
~0U>>1 = 2147483647
~0>>1 = -1
===========
According to my understanding ~0 is -1.So I will get all bit 1 as a
result of ~0 in 2's complement system.

So the first two line of output saying ~0 is same as ~0U. Then why
there is difference in the output of ~0U>>1 and ~0>>1 ?
please provide some input.

I don't think anyone has said yet that the result of right shifting a
negative value is, explicitly, implementation-defined. Some machines
will do one things and some another. The C standard leaves it up to the
implementation to say what it does. The result of ~0U >> 1 is defined
by the language -- it must be UINT_MAX/2 (that's C's division
there, of course, not mathematical division) but ~0 >> 1 can be anything
the implementation chooses. The two most likely possibilities are
INT_MAX and -1.

J

James Piper

  • Mar 8, 2012
  • #5

Close, but backwards.

~0 is all bit 1.

So you will get -1 as a
result of ~0 in 2's complement system.

That's true.

1 in 8-bit format is: 0000 0001
To get neg- 1:
1. Negate bits. 1111 1110
2. Add 1: 1111 11111

Same results regardless of the bit size.

T

Tim Rentsch

  • Mar 9, 2012
  • #6

pete said:

Another way for negatising in two's complement is:
1. subtract 1. 0000 0000
2. Negate bits: 1111 11111

I've worked on assembly code
that had it done either way in different parts of the code.
I don't know if it was done by the same person.

The first method turns x into -x; the second turns -x into x.

Remember, only 22 more shopping days before March 32.

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads

A process take input from /proc/<pid>/fd/0, but won't process it0
does 0<(unsigned short)0x8000 hold?13
Beginner at c0
Please help with C programming to save GPS reception data in Raspberry Pi.0
Comparison of Integer and Pointer (that's supposed to be an Integer). Where did I go wrong?0
Command Line Arguments0
C program: memory leak/ segmentation fault/ memory limit exceeded0
difference between pointers44

Members online

  • VBService

Total:63 (members:2, guests:61)
Robots:63

Forum statistics

Threads
473,800
Messages
2,569,656
Members
45,400
Latest member
BuyZapGuardian

Latest Threads

  • Boa tarde! Preciso de ajuda, como conseguir extrair de forma gratuita contatos para prospecção?

    • Started by Bruna
  • Final chapter of "Learn PHP, MySQL and JavaScript"

    • Started by musicman1985
  • Im having some issues with my html website

    • Started by tallzebra
  • I made a blockchain and want to make a cryptocurrency, but my code doesn't verify hash of each block

    • Started by Vast3
  • Impossible carved cubes (1 line of html, 3 elements of css) WOW!

    • Started by VBService
  • Problem leap year calculation

    • Started by deepthi.kodakandla
  • Key Factors in JavaScript Testing from a QA Engineer's Perspective

    • Started by AvivMNS
  • STEPHANIE BEAUDEAU EMSWORTH: SLANDER VICTIM

    • Started by DefenderMa
  • SLANDER AGAINST STEPHANIE EMSWORTH

    • Started by DefenderMa
  • New CSS features for smooth entry and exit animations

    • Started by VBService
  • Forums
  • Archive
  • Archive
  • C Programming
difference between ~0U and ~0 | C Programming (2024)
Top Articles
Latest Posts
Article information

Author: Lidia Grady

Last Updated:

Views: 5569

Rating: 4.4 / 5 (45 voted)

Reviews: 92% of readers found this page helpful

Author information

Name: Lidia Grady

Birthday: 1992-01-22

Address: Suite 493 356 Dale Fall, New Wanda, RI 52485

Phone: +29914464387516

Job: Customer Engineer

Hobby: Cryptography, Writing, Dowsing, Stand-up comedy, Calligraphy, Web surfing, Ghost hunting

Introduction: My name is Lidia Grady, I am a thankful, fine, glamorous, lucky, lively, pleasant, shiny person who loves writing and wants to share my knowledge and understanding with you.