I have a general idea about how negative number systems work, but I'd
appreciate some clarification if anyone would be willing to help me.
Let's assume we're working with an 8Bit signed integer, and that it
contains no padding.
Firstly, I realise that the MSB is known as the signbit, and that it
indicates whether the number is positive or negative (irrespective of
which negative number system is used).
The next seven bits tell us the value. If the number is positive, then
the seven bits represent the number in the same domestic way in which an
unsigned integer would represent the number.
But if the number is negative, then there's separate methods to correlate
the negative bitpattern with its corresponding positive value:
(1) Signmagnitude: The bitpattern is exactly the same.
(2) One's complement: Toggle each bit.
(3) Two's complement: Toggle each bit, then add 1.
It seems we get the following ranges for each format: (Are they right?)
(1) Signmagnitude: 127 through +127
(2) One's complement: 128 through +127
(3) Two's complement: 128 through +127
It would seem that each number system has the following advantages:
(1) Signmagnitude:
Efficient conversion from negative to positive.
(2) One's complement:
There's only one bitpattern for zero.
One extra unit in the negative range.
(3) Two's complement:
There's only one bitpattern for zero.
One extra unit in the negative range.
Addition with negative numbers can be performed exactly as if
they were positive.
Are there any other advantage/disadvantages to be aware of?
The next thing I want to discuss is the whole idea of having more than
one bitpattern for a specific value... zero in particular!.
If we have a machine that uses signmagnitude, and we have two separate
variables that hold the value zero, is it possible for them to have
different bit patterns? i.e.:
var1 == 0000 0000
var2 == 1000 0000
How does the machine handle comparison of these two variables? Would it
interpret:
if ( var1 == var2 )
as:
if ( !(var1 & 127  var2 & 127) )
I'd ask more question as people reply...

Frederick Gotham 39 4042
Frederick Gotham wrote: It seems we get the following ranges for each format: (Are they right?)
(1) Signmagnitude: 127 through +127 (2) One's complement: 128 through +127 (3) Two's complement: 128 through +127
Yes, except that implementations
are allowed to have SCHAR_MIN equal to 127,
regardless of representation.
The next thing I want to discuss is the whole idea of having more than one bitpattern for a specific value... zero in particular!.
If we have a machine that uses signmagnitude, and we have two separate variables that hold the value zero, is it possible for them to have different bit patterns? i.e.:
var1 == 0000 0000 var2 == 1000 0000
How does the machine handle comparison of these two variables?
A machine has two choices,
an integer object with the representation for negative zero,
either compares equal to zero
or has a trap representation.

pete
pete posted: var1 == 0000 0000 var2 == 1000 0000
How does the machine handle comparison of these two variables?
A machine has two choices, an integer object with the representation for negative zero, either compares equal to zero or has a trap representation.
Nicely put.
Does that mean that you MUST have padding within a signed integer in order
for "negative zero" to be a trap representation? The reason I ask is as
follows: I recall reading something recently along the lines of "The value
representation bits of an integer type shall not be involved in trapping".
This makes me think that, if you're going to have a trap representation,
then you must have at least one padding bit.

Frederick Gotham
Frederick Gotham schrieb: I have a general idea about how negative number systems work, but I'd appreciate some clarification if anyone would be willing to help me.
Let's assume we're working with an 8Bit signed integer, and that it contains no padding.
Firstly, I realise that the MSB is known as the signbit, and that it indicates whether the number is positive or negative (irrespective of which negative number system is used).
The next seven bits tell us the value. If the number is positive, then the seven bits represent the number in the same domestic way in which an
domestic?
unsigned integer would represent the number.
But if the number is negative, then there's separate methods to correlate the negative bitpattern with its corresponding positive value:
(1) Signmagnitude: The bitpattern is exactly the same. (2) One's complement: Toggle each bit. (3) Two's complement: Toggle each bit, then add 1.
Note that the last rule does not cover
10000000
whereas the rule "pretend that unsigned representations of values
in the range 1<<7 to (1<<8)1 are treated as 'unsigned value 
(1<<8)'" does.
Note that C90 does not prescribe one of these three, so you could
come up with "sign magnitude  1" or "sign plus inverted order
value bits" or ...
C99 restricts your choice to 1s complement, 2s complement, and
signmagnitude.
It seems we get the following ranges for each format: (Are they right?)
(1) Signmagnitude: 127 through +127 (2) One's complement: 128 through +127
Wrong. Reread your rule above. Ones complement covers
127 to 127
(3) Two's complement: 128 through +127
It would seem that each number system has the following advantages:
(1) Signmagnitude:
Efficient conversion from negative to positive.
Easy multiplication/division of negative and positive numbers.
Symmetric range. (2) One's complement:
There's only one bitpattern for zero.
Wrong. 11111111 fits your definition.
One extra unit in the negative range.
Wrong.
Advantages: ~ means the same as unary minus.
Symmetric range.
(3) Two's complement:
There's only one bitpattern for zero. One extra unit in the negative range. Addition with negative numbers can be performed exactly as if they were positive.
Often "compute through overflow" possible to extend range.
Disadvantages:
 >> for arithmetic shift means "round down
division" instead of real division.
 asymmetric range: You pay simply too much for the "one extra
unit". Having to write 327671 in order to make sure that you
arrive at the right value with the right type simply is a
little bit too much. This can incur many ugly checks and can be
for many things as annoying as "value preserving instead of
unsigned preserving".[*]
Are there any other advantage/disadvantages to be aware of?
Sure  depending on your application. See above for a few of
them.
The next thing I want to discuss is the whole idea of having more than one bitpattern for a specific value... zero in particular!.
If we have a machine that uses signmagnitude, and we have two separate variables that hold the value zero, is it possible for them to have different bit patterns? i.e.:
var1 == 0000 0000 var2 == 1000 0000
Yes. The implementation can treat 10000000 (or, for 1sC, 11111111)
as "trap representation" or "negative zero".
The C99 standard specifically deals with "negative zero" (I am too
lazy to look it up, have a look at N1124.pdf; I am also too lazy
to find out what you can find in C90).
How does the machine handle comparison of these two variables? Would it interpret:
if ( var1 == var2 )
as:
if ( !(var1 & 127  var2 & 127) )
This is the implementation' s problem, not yours, so you are going
toward offtopic.
Cheers
Michael

EMail: Mine is an /at/ gmx /dot/ de address.
Frederick Gotham wrote On 06/27/06 17:42,: I have a general idea about how negative number systems work, but I'd appreciate some clarification if anyone would be willing to help me.
Let's assume we're working with an 8Bit signed integer, and that it contains no padding.
Firstly, I realise that the MSB is known as the signbit, and that it indicates whether the number is positive or negative (irrespective of which negative number system is used).
You're on shaky ground when you designate the sign bit
as the "most significant." It'd be clearer just to say that
the eightbit number has one sign bit and seven value bits.
The next seven bits tell us the value. If the number is positive, then the seven bits represent the number in the same domestic way in which an unsigned integer would represent the number.
Again, "next" is an iffy proposition best left alone.
(And there's that peculiar use of "domestic" again; it's
not a usage I've ever encountered except in your writing.)
But if the number is negative, then there's separate methods to correlate the negative bitpattern with its corresponding positive value:
(1) Signmagnitude: The bitpattern is exactly the same. (2) One's complement: Toggle each bit. (3) Two's complement: Toggle each bit, then add 1.
Instead of thinking about shuffling the bits, think about
the seven value bits encoding a nonnegative value V and the sign
bit specifying a transformation of that value. If the sign bit
is zero there is no transformation and the value of the eightbit
integer is V. If the sign bit is one
(1) Signed magnitude: The value is V
(2) Ones' complement: The value is V127
(3) Two's complement: The value is V128
It seems we get the following ranges for each format: (Are they right?)
(1) Signmagnitude: 127 through +127 (2) One's complement: 128 through +127 (3) Two's complement: 128 through +127
(1) and (3) are right, but the range for (2) is 127
through 127. The bit patterns allzero and allone both
represent zero (allone is informally called "minus zero").
In theory, the ranges supported by C can be "smaller"
than these. The "minus zero" patterns for (1) and (2) and
the 128 pattern for (3) could be trap representations rather
than actual attainable values. I'm not personally familiar
with any C implementations that do such a thing, but that
doesn't prove there aren't any.
It would seem that each number system has the following advantages:
(1) Signmagnitude:
Efficient conversion from negative to positive.
This won't be a consideration for small integers.
The circuitry to negate a value that can fit in a machine's
accumulator will do the job quite quickly; getting the value
to and from the accumulator will probably dominate.
(2) One's complement:
There's only one bitpattern for zero. One extra unit in the negative range.
There are two bit patterns for zero, and no extra unit.
Ones' complement has a (possibly insignificant) disadvantage
in that some operations require an "endaround carry" where
a carry out of the most significant bit must be added back
in at the least significant position. Since that position
can also be an input to determining the carry, a little more
delay may be required  but if the whole thing completes in
less than a clock cycle, it doesn't matter how much or how
little "spare time" remains.
(3) Two's complement:
There's only one bitpattern for zero. One extra unit in the negative range. Addition with negative numbers can be performed exactly as if they were positive.
That last seems to be the big attraction, big enough to
outweigh the inconvenience of the asymmetrical range.
Are there any other advantage/disadvantages to be aware of?
The next thing I want to discuss is the whole idea of having more than one bitpattern for a specific value... zero in particular!.
If we have a machine that uses signmagnitude, and we have two separate variables that hold the value zero, is it possible for them to have different bit patterns? i.e.:
var1 == 0000 0000 var2 == 1000 0000
Yes, these would both represent the value zero.
How does the machine handle comparison of these two variables? Would it interpret:
if ( var1 == var2 )
as:
if ( !(var1 & 127  var2 & 127) )
How the machine handles the comparison is a matter for
the circuit designers and the compiler writers. What C
requires is that any two zero values generated by "proper"
means must compare equal to each other, less than all positive
integers, and greater than all negative integers.
This may just fall out of the way the machine's comparator
works. If it doesn't, C will need to take steps to "normalize"
the values before comparing them, transforming "minus zero"
to "canonical zero." There's a possible surprise here, in
that a C implementation might avoid the problem by operating
the arithmetic unit in a mode that never produces "minus
zero" as a result: that way, all zeroes are already canonical,
and the compiler need not generate normalization code. But
if you use typepunning shenanigans to generate a "minus
zero" representation by devious means, that zero might or
might not behave the way a pedigreed C zero must. (At least,
I don't see any guarantee; others might be able to find one.)
 Er*********@sun .com
Frederick Gotham wrote: pete posted:
var1 == 0000 0000 var2 == 1000 0000
How does the machine handle comparison of these two variables? A machine has two choices, an integer object with the representation for negative zero, either compares equal to zero or has a trap representation.
Nicely put.
Does that mean that you MUST have padding within a signed integer in order for "negative zero" to be a trap representation?
No.
A signed magnitude representation
with the sign bit is set,
can either be equal to zero or not represent any number.
All bits set in one's complement, is the same way.
The reason I ask is as follows: I recall reading something recently along the lines of "The value representation bits of an integer type shall not be involved in trapping".
How about :
no arithmetic operation on valid
values can generate a trap representation other than as
part of an exception such as an overflow
?

pete
pete wrote: A signed magnitude representation with the sign bit is set,
with only the sign bit set,
can either be equal to zero or not represent any number. All bits set in one's complement, is the same way.

pete
Frederick Gotham wrote: "negative zero"
ISO/IEC 9899
6.2.6.2 Integer types
2
If the sign bit is one, the value shall be
modified in one of the following ways:
— the corresponding value with sign bit 0 is negated
(sign and magnitude);
— the sign bit has the value (2N) (two’s complement);
— the sign bit has the value (2N  1) (one’s complement).
Which of these applies is implementationdefined,
as is whether the value with sign bit 1 and all value bits zero
(for the first two), or with sign bit and all value bits 1
(for one’s complement),
is a trap representation or a normal value.
In the case of sign and magnitude and one’s complement,
if this representation is a normal value it is called a
negative zero.
3 If the implementation supports negative zeros,
they shall be generated only by:
— the &, , ^, ~, <<, and >> operators with arguments
that produce such a value;
— the +, , *, /, and % operators where one argument
is a negative zero and the result is zero;
— compound assignment operators based on the above cases.
It is unspecified whether these cases actually generate a
negative zero or a normal zero, and whether a negative zero
becomes a normal zero when stored in an object.
4 If the implementation does not support negative zeros,
the behavior of the &, , ^, ~, <<, and >> operators with
arguments that would produce such a value is undefined.

pete
Michael Mair posted: domestic?
Eric Sosman posted:
(And there's that peculiar use of "domestic" again; it's not a usage I've ever encountered except in your writing.)
Must be a dialectal thing (I'm Irish, but a native speaker of English).
If I say something like:
What's the domestic way of eating a banana?
Then I mean something along the lines of:
What's the commonplace and prevalent method of eating a banana which
has widespread acceptance and is wellknown?
Hope that helps! : )
Another thing: up until a week or two ago, I used to always say:
127 to 127 inclusive
But now (in my posts at least), I say:
127 through 127
I like the ring to it, plus it's very precise. If I wanted to be equally
precise using "to", I'd have to say something like:
127 inclusive to 127 inclusive
"through" doesn't get such usage in Ireland.
[More offtopic stuff...]
I was in the US last year, Masachusets (sorry about the spelling!),
Colarado and New York; I heard a lot of "I work Monday through Friday"
over there. In Ireland, we say "I work Monday to Friday", even though
it's ambiguous as to whether me mean inclusive, exclusive, or a
combination of both.
But by FAR the hardest things to come to grips with when travelling is
the use of slang, and also vocabulary which is mutually unknown to each
other  things like "sweater" instead of "jumper", "trainers" instead of
"runners", "bandaids" instead of "plasters".

Frederick Gotham
Frederick Gotham said:
<snip> If I say something like:
What's the domestic way of eating a banana?
Then I mean something along the lines of:
What's the commonplace and prevalent method of eating a banana which has widespread acceptance and is wellknown?
Aha! All is now clear.
The canonical term for that is "canonical" .

Richard Heathfield
"Usenet is a strange place"  dmr 29/7/1999 http://www.cpax.org.uk
email: rjh at above domain (but drop the www, obviously) This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics 
by: Imbaud Pierre 
last post by:
integer division and modulo gives different results in c and python,
when negative numbers
are involved. take gdb as a widely available c interpreter
print 2 /3
0 for c, 1 for python.
more amazing, modulos of negative number give negative values! (in c).
from an algebraic point of view, python seems right, but I thought
python conformity to the underlying c compiler was a strong commitment,
obviously not here, and I found no...

by: pj 
last post by:
Why does M$ Query Analyzer display all numbers as positive, no matter
whether they are truly positive or negative ?
I am having to cast each column to varchar to find out if there are
any negative numbers being hidden from me :(
I tried checking Tools/Options/Connections/Use Regional Settings both
on and off, stopping and restarting M$ Query Analyer in betwixt, but
no improvement.

by: Charles A. Lackman 
last post by:
Hello,
I have some textboxes that are doing addition:
Dim AString As Double
AString = Convert.ToDouble(TextBox1.Text)  Convert.To(DoubleTextBox2.Text)
TextBox3.Text = AString.ToString("#,##0.00;(#,##0.00);0.00")
When the result is negative it is displayed as "(46)" or whatever the value
is.

by: Subrahmanyam Arya 
last post by:
Hi Folks ,
I am trying to solve the problem of reading the numbers correctly
from a serial line into an intel pentium processor machine .
I am reading 1 byte and 2byte data both positive and negative
quantities .
Can any one tell me what are the things i should bear in mind .

by: tlyczko 
last post by:
Hello Rob B posted this wonderful code in another thread,
http://groups.google.com/group/comp.lang.javascript/browse_thread/thread/c84d8538025980dd/6ead9d5e61be85f0#6ead9d5e61be85f0
I could not figure out how to reply to the thread per se using Google
Groups and so please forgive me for cutting and pasting (I emailed him
but he may not have time to check his email), and I am hoping someone
might be able to tell me how I can change this...
 
by: jaks.maths 
last post by:
How to convert negative integer to hexadecimal or octal number?
Ex: 568
What is the equivalent hexadecimal and octal number??

by: andreas.lydersen 
last post by:
Hi!
While communicating with a monitoring unit, I get some hex values
representing degrees celcius from its probes. The values can be
something like '19' or '7d'. To convert it to int, I do the following:

Python 2.4.2 (#1, Sep 28 2005, 10:25:47)
on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> int('7d', 16)

by: drtimhill 
last post by:
I'm just starting out on Python, and am stumped by what appears an oddity in the way negative indices are handled.
For example, to get the last character in a string, I can enter "x". To get the 2nd and 3rd to last, I can enter x etc. This is fine.
Logically, I should be able to enter x to get the last and next to last characters. However, since Python doesn't distinguish between positive and negative zero, this doesn't work. Instead, I...

by: Casey 
last post by:
Is there an easy way to use getopt and still allow negative numbers as
args? I can easily write a workaround (preprocess the tail end of
the arguments, stripping off any nonoptions including negative
numbers into a separate sequence and ignore the (now empty) args list
returned by getopt, but it would seem this is such a common
requirement that there would be an option to treat a negative value as
an argument. Note that this is only a...

by: marktang 
last post by:
ONU (Optical Network Unit) is one of the key components for providing highspeed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...

by: Hystou 
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can effortlessly switch the default language on Windows 10 without reinstalling. I'll walk you through it.
First, let's disable language synchronization. With a Microsoft account, language settings sync across devices. To prevent any complications,...
 
by: Oralloy 
last post by:
Hello folks,
I am unable to find appropriate documentation on the type promotion of bitfields when using the generalised comparison operator "<=>".
The problem is that using the GNU compilers, it seems that the internal comparison operator "<=>" tries to promote arguments from unsigned to signed.
This is as boiled down as I can make it.
Here is my compilation command:
g++12 std=c++20 Wnarrowing bit_field.cpp
Here is the code in...

by: jinu1996 
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...

by: Hystou 
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows Update option using the Control Panel or Settings app; it automatically checks for updates and installs any it finds, whether you like it or not. For most users, this new feature is actually very convenient. If you want to control the update process,...

by: tracyyun 
last post by:
Dear forum friends,
With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, ZWave, WiFi, Bluetooth, etc. Each protocol has its own unique characteristics and advantages, but as a user who is planning to build a smart home system, I am a bit confused by the choice of these technologies. I'm particularly interested in Zigbee because I've heard it does some...

by: isladogs 
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...

by: adsilva 
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
 
by: muto222 
last post by:
How can i add a mobile payment intergratation into php mysql website.
 