Signed and Unsigned Integral Types

This section explains the differences between signed and unsigned integral types.

The underlying binary representation of an object x of any integral type looks like this (assuming n-bit storage):

dn-1dn-2...d2d1d0

where each di is either 0 or 1. The computation of the decimal equivalent value of x depends on whether x is an unsigned or signed type. If x is unsigned, the decimal equivalent value is

dn-1*2n-1 + dn-2*2n-2 +...+ d2*22 + d1*21 + d0*20

The largest (positive) value that can be expressed by an unsigned integer is, therefore,

2n - 1 = 1*2n-1 + 1*2n-2 +...+ 1*22 + 1*21 + 1*20

If x is signed, the decimal equivalent value is

dn-1*-(2n-1) + dn-2*2n-2 +...+ d2*22 + d1*21 + d0*20

The largest (positive) value that can be expressed by a signed integer is

2n-1 - 1 = 0*-(2n-1) + 1*2n-2 +...+ 1*22 + 1*21 + 1*20

This is called "two's complement" representation. To determine the representation of the negative of a signed integer,

1.

Compute the "one's complement" of the number (i.e., replace each bit with its complement).
 

2.

Add 1 to the "one's complement" produced in the first step.
 

8-Bit Integer Example

Suppose that we have a tiny system that uses only 8 bits to represent a number. On this system, the largest unsigned integer would be

11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

But that same number, interpreted as a signed integer, would be

11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

 

Exercises: Signed and Unsigned Integral Types

You be the computer ...

For these exercises, simulate the action of the computer as it executes the given code and specify what you think the output will be. You can always compile and run the code yourself to see if your output is correct. If you disagree with the computer, try to explain why.

1.
#include 
using namespace std;
int main() {
 unsigned n1 = 10;
 unsigned n2 = 9;
 char *cp;
 cp = new char[n2 n1];
 if(cp == 0)
 cout << "That's all!" << endl;
 cout << "bye bye!" << endl;
}
 
2.
#include 
using namespace std;

int main() {
 int x(7), y = 11;
 char ch = 'B';
 double z(1.34);
 ch += x;
 cout << ch << endl;
 cout << y + z << endl;
 cout << x + y * z << endl;
 cout << x / y * z << endl;
}
 
3.
#include 
using namespace std;

bool test(int x, int y)
{ return x / y; }

int main()
{ int m = 17, n = 18;
 cout << test(m,n) << endl;
 cout << test(n,m) << endl;
 m += n;
 n /= 5;
 cout << test(m,n) << endl;
}
 


Part I: Introduction to C++ and Qt 4

C++ Introduction

Classes

Introduction to Qt

Lists

Functions

Inheritance and Polymorphism

Part II: Higher-Level Programming

Libraries

Introduction to Design Patterns

QObject

Generics and Containers

Qt GUI Widgets

Concurrency

Validation and Regular Expressions

Parsing XML

Meta Objects, Properties, and Reflective Programming

More Design Patterns

Models and Views

Qt SQL Classes

Part III: C++ Language Reference

Types and Expressions

Scope and Storage Class

Statements and Control Structures

Memory Access

Chapter Summary

Inheritance in Detail

Miscellaneous Topics

Part IV: Programming Assignments

MP3 Jukebox Assignments

Part V: Appendices

MP3 Jukebox Assignments

Bibliography

MP3 Jukebox Assignments



An Introduction to Design Patterns in C++ with Qt 4
An Introduction to Design Patterns in C++ with Qt 4
ISBN: 0131879057
EAN: 2147483647
Year: 2004
Pages: 268

Flylib.com © 2008-2020.
If you may any questions please contact us: flylib@qtcs.net