265 lines
6.9 KiB
C
265 lines
6.9 KiB
C
/* types.c -- find out size of data types */
|
|
|
|
/*
|
|
|
|
output on Mac OS X PPCi, memory model ILP32
|
|
|
|
type bytes
|
|
-----------------
|
|
char 1
|
|
char * 4
|
|
void * 4
|
|
short int 2
|
|
int 4
|
|
long 4
|
|
long int 4
|
|
long long int 8
|
|
float 4
|
|
double 8
|
|
wchar_t 4
|
|
size_t 4
|
|
off_t 4
|
|
time_t 4
|
|
intptr_t 4
|
|
|
|
output on Windows MinGW 32-bit
|
|
|
|
type bytes
|
|
-----------------
|
|
char 1
|
|
char * 4
|
|
void * 4
|
|
short int 2
|
|
int 4
|
|
long 4
|
|
long int 4
|
|
long long int 8
|
|
float 4
|
|
double 8
|
|
long double 12
|
|
wchar_t 2
|
|
size_t 4
|
|
off_t 4
|
|
time_t 4
|
|
intptr_t 4
|
|
|
|
output on AMD64 and Intel dual Core 2, memory model LP64
|
|
|
|
type bytes
|
|
-----------------
|
|
char 1
|
|
char * 8
|
|
void * 8
|
|
short int 2
|
|
int 4
|
|
long 8
|
|
long int 8
|
|
long long int 8
|
|
float 4
|
|
double 8
|
|
long double 16
|
|
wchar_t 4
|
|
size_t 8
|
|
off_t 8
|
|
time_t 8
|
|
intptr_t 8
|
|
|
|
LLP64 Windows when compiling with tdm gcc 64-bit
|
|
|
|
type bytes
|
|
-----------------
|
|
char 1
|
|
char * 8
|
|
void * 8
|
|
short int 2
|
|
int 4
|
|
long 4
|
|
long int 4
|
|
long long int 8
|
|
float 4
|
|
double 8
|
|
long double 16
|
|
wchar_t 2
|
|
size_t 8
|
|
off_t 4
|
|
time_t 8
|
|
intptr_t 8
|
|
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <wchar.h>
|
|
#include <fcntl.h>
|
|
#include <locale.h>
|
|
#include <inttypes.h>
|
|
|
|
#ifndef time_t
|
|
#include <time.h>
|
|
#endif
|
|
|
|
typedef struct {
|
|
char one;
|
|
short int two;
|
|
int four;
|
|
} alignment1;
|
|
|
|
typedef struct {
|
|
char one;
|
|
int four;
|
|
short int two;
|
|
} alignment2;
|
|
|
|
typedef struct {
|
|
char one;
|
|
short int two;
|
|
long three;
|
|
int four;
|
|
} alignment3;
|
|
|
|
typedef struct {
|
|
char one;
|
|
long three;
|
|
short int two;
|
|
int four;
|
|
} alignment4;
|
|
|
|
#define str2cmp(s1,s2) ( ( (*(unsigned char *)(s1) << 8) | *((unsigned char *)(s1) + 1) ) - \
|
|
( (*(unsigned char *)(s2) << 8) | *((unsigned char *)(s2) + 1) ) )
|
|
void printMemoryModel(void);
|
|
|
|
int main(int argc, char * argv[])
|
|
{
|
|
int endian = 1;
|
|
long long int x, y, z;
|
|
|
|
alignment1 checkstruct1;
|
|
alignment2 checkstruct2;
|
|
alignment3 checkstruct3;
|
|
alignment4 checkstruct4;
|
|
|
|
printf("\n");
|
|
printf("type bytes\n");
|
|
printf("-----------------\n");
|
|
printf("char %lu\n", sizeof(char));
|
|
printf("char * %lu\n", sizeof(char *));
|
|
printf("void * %lu\n", sizeof(void *));
|
|
printf("short int %lu\n", sizeof(short int));
|
|
printf("int %lu\n", sizeof(int));
|
|
printf("long %lu\n", sizeof(long));
|
|
printf("long int %lu\n", sizeof(long int));
|
|
printf("long long int %lu\n", sizeof(long long int));
|
|
printf("float %lu\n", sizeof(float));
|
|
printf("double %lu\n", sizeof(double));
|
|
printf("long double %lu\n", sizeof(long double));
|
|
printf("wchar_t %lu\n", sizeof(wchar_t));
|
|
printf("size_t %lu\n", sizeof(size_t));
|
|
printf("off_t %lu\n", sizeof(off_t));
|
|
printf("time_t %lu\n", sizeof(time_t));
|
|
#if defined(_INTTYPES_H_)
|
|
printf("intptr_t %lu\n", sizeof(intptr_t));
|
|
#endif
|
|
|
|
printf("\nAlignment:\n");
|
|
printf("size of struct {char, short int, int} is: %ld\n", sizeof(checkstruct1));
|
|
printf("size of struct {char, int, short int} is: %ld\n", sizeof(checkstruct2));
|
|
printf("size of struct {char, short int, long, int} is: %ld\n", sizeof(checkstruct3));
|
|
printf("size of struct {char, long, short int, int} is: %ld\n", sizeof(checkstruct4));
|
|
printf("\n");
|
|
|
|
printf("format input output\n");
|
|
printf("--------------------------------------------------\n");
|
|
printf("%%d 0x7fffffff %d\n", 0x7fffffff);
|
|
printf("%%d 0x80000000 %d\n", 0x80000000);
|
|
printf("%%d 0xffffffff %d\n", 0xffffffff);
|
|
printf("%%u 0x7fffffff %u\n", 0x7fffffff);
|
|
printf("%%u 0x80000000 %u\n", 0x80000000);
|
|
printf("%%u 0xffffffff %u\n", 0xffffffff);
|
|
#ifndef TRUE64
|
|
/* will handle either 32bit or 64bit depending on platform
|
|
printf("%%ld 0x7fffffffffffffffL %ld\n", 0x7FFFFFFFL);
|
|
printf("%%ld 0x8000000000000000L %ld\n", 0x80000000L);
|
|
printf("%%ld 0xffffffffffffffffL %ld\n", 0xFFFFFFFFL);
|
|
printf("%%lu 0x7fffffffffffffffL %lu\n", 0x7FFFFFFFL);
|
|
printf("%%lu 0x8000000000000000L %lu\n", 0x80000000L);
|
|
printf("%%lu 0xffffffffffffffffL %ld\n", 0xFFFFFFFFL);
|
|
*/
|
|
#endif
|
|
printf("%%llx 0x7FFFFFFFFFFFFFFFLL %llx\n", 0x7FFFFFFFFFFFFFFFLL);
|
|
printf("%%llx 0x8000000000000000LL %llx\n", 0x8000000000000000LL);
|
|
printf("%%llx 0xFFFFFFFFFFFFFFFFLL %llx\n", 0xFFFFFFFFFFFFFFFFLL);
|
|
printf("%%llX 0x7fffffffffffffffLL %llX\n", 0x7fffffffffffffffLL);
|
|
printf("%%llX 0x8000000000000000LL %llX\n", 0x8000000000000000LL);
|
|
printf("%%llX 0xffffffffffffffffLL %llX\n", 0xffffffffffffffffLL);
|
|
#ifndef TRU64
|
|
printf("%%lld 0x7fffffffffffffffLL %lld\n", 0x7fffffffffffffffLL);
|
|
printf("%%lld 0x8000000000000000LL %lld\n", 0x8000000000000000LL);
|
|
printf("%%lld 0xffffffffffffffffLL %lld\n", 0xffffffffffffffffLL);
|
|
printf("%%llu 0x7fffffffffffffffLL %lld\n", 0x7fffffffffffffffLL);
|
|
printf("%%llu 0x8000000000000000LL %llu\n", 0x8000000000000000LL);
|
|
printf("%%llu 0xffffffffffffffffLL %llu\n", 0xffffffffffffffffLL);
|
|
#else
|
|
printf("%%ld 0x7fffffffffffffffLL %ld\n", 0x7FFFFFFFFFFFFFFFLL);
|
|
printf("%%ld 0x8000000000000000LL %ld\n", 0x8000000000000000LL);
|
|
printf("%%ld 0xffffffffffffffffLL %ld\n", 0xFFFFFFFFFFFFFFFFLL);
|
|
printf("%%lu 0x7fffffffffffffffLL %lu\n", 0x7FFFFFFFFFFFFFFFLL);
|
|
printf("%%lu 0x8000000000000000LL %lu\n", 0x8000000000000000LL);
|
|
printf("%%lu 0xffffffffffffffffLL %ld\n", 0xFFFFFFFFFFFFFFFFLL);
|
|
#endif
|
|
|
|
printf("\n");
|
|
|
|
if(*(char *)&endian == 1)
|
|
printf("CPU is little endian\n");
|
|
else
|
|
printf("CPU is big endian\n");
|
|
|
|
#ifdef __LITTLE_ENDIAN__
|
|
printf("The constant __LITTLE_ENDIAN__ is defined by the compiler\n");
|
|
#endif
|
|
|
|
#ifdef __BIG_ENDIAN__
|
|
printf("The constant __BIG_ENDIAN__ is defined by the compiler\n");
|
|
#endif
|
|
|
|
printMemoryModel();
|
|
printf("\n");
|
|
|
|
/*
|
|
x = 9223372036854775807LL;
|
|
y = 1000LL;
|
|
z = x * y;
|
|
printf("\n9223372036854775807 * 1000 = %ld <- should be -1000\n", z);
|
|
|
|
x = 11;
|
|
y = -4;
|
|
z = x % y;
|
|
|
|
printf("11 %% -4 = %ld <- should be 3\n", z);
|
|
|
|
setlocale(LC_NUMERIC, "");
|
|
printf("$%'.2Lf\n", 123456789.00L);
|
|
printf("$%'.2Lf\n", 1234.56L);
|
|
printf("$%'.2Lf\n", 123.45L);
|
|
*/
|
|
|
|
|
|
exit(0);
|
|
}
|
|
|
|
void printMemoryModel(void)
|
|
{
|
|
short sc = sizeof(char) * 8;
|
|
short ss = sizeof(short) * 8;
|
|
short si = sizeof(int) * 8;
|
|
short sl = sizeof(long) * 8;
|
|
short sp = sizeof(void*) * 8;
|
|
|
|
printf("\nMemory model is ");
|
|
if (si == 32 && sl == 64 && sp == 64) { printf("LP64\n"); return;}
|
|
if (si == 64 && sl == 64 && sp == 64) { printf("ILP64\n"); return;}
|
|
if (si == 32 && sl == 32 && sp == 64) { printf("LLP64\n"); return;}
|
|
if (si == 32 && sl == 32 && sp == 32) { printf("ILP32\n"); return;}
|
|
if (si == 16 && sl == 32 && sp == 32) { printf("LP32\n"); return;}
|
|
printf("UNKNOWN\n");
|
|
}
|