JavaScript is required to for searching.
Skip Navigation Links
Exit Print View
Solaris 64-bit Developer's Guide
search filter icon
search icon

Document Information

Preface

1.  64-bit Computing

2.  When to Use 64-bit

3.  Comparing 32-bit Interfaces and 64-bit Interfaces

4.  Converting Applications

Data Model

Implementing Single-Source Code

Feature Test Macros

Derived Types

<sys/types.h> File

<inttypes.h> File

Fixed-Width Integer Types

uintptr_t and Other Helpful Types

Constant Macros

Limits Defined by <inttypes.h>

Format String Macros

Tools Support

lint for 32-bit and 64-bit Environments

Guidelines for Converting to LP64

Do Not Assume int and Pointers Are the Same Size

Do Not Assume int and long Are the Same Size

Sign Extension

Use Pointer Arithmetic Instead of Address Arithmetic

Repacking a Structure

Check Unions

Specify Constant Types

Beware of Implicit Declaration

sizeof is an unsigned long

Use Casts to Show Your Intentions

Check Format String Conversion Operation

Other Considerations

Derived Types That Have Grown in Size

Check for Side Effects of Changes

Check Whether Literal Uses of long Still Make Sense

Use #ifdef for Explicit 32-bit Versus 64-bit Prototypes

Algorithmic Changes

Checklist for Getting Started

Sample Program

5.  The Development Environment

6.  Advanced Topics

A.  Changes in Derived Types

B.  Frequently Asked Questions (FAQs)

Index

Sample Program

The following sample program, foo.c, directly illustrates the effect of the LP64 data model in contrast to the ILP32 data models. The same program can be compiled as either a 32–bit program or a 64–bit program.

#include <stdio.h>
int
main(int argc, char *argv[])
{
        (void) printf("char is \t\t%lu bytes\n", sizeof (char));
        (void) printf("short is \t%lu bytes\n", sizeof (short));
        (void) printf("int is \t\t%lu bytes\n", sizeof (int));
        (void) printf("long is \t\t%lu bytes\n", sizeof (long));
        (void) printf("long long is \t\t%lu bytes\n", sizeof (long long));
        (void) printf("pointer is \t%lu bytes\n", sizeof (void *));
        return (0);
} 

The result of 32–bit compilation is:

% cc -O -o foo32 foo.c
% foo32 
char is          1 bytes
short is         2 bytes
int is           4 bytes
long is          4 bytes
long long is     8 bytes
pointer is       4 bytes   

The result of 64–bit compilation is:

% cc -xarch=generic64 -O -o foo64 foo.c 
% foo64
char is          1 bytes
short is         2 bytes
int is           4 bytes
long is          8 bytes
long long is     8 bytes 
pointer is       8 bytes

Note - The default compilation environment is designed to maximize portability, that is, to create 32–bit applications.