A
Army1987
Is there anything wrong with this (assuming sizeof(int) < 10,
or '9' + 1, '9' + 2, ..., '0' + sizeof(int) are reasonable
characters, and bits aren't "shuffled" all around)?
#include <stdio.h>
#include <string.h>
#include <limits.h>
int main(void)
{
if (sizeof(int) > 1) {
unsigned int num = 0;
unsigned char repr[sizeof num];
unsigned int placeholder = '1';
size_t i;
enum {unknown, little, big} endianness = big;
for (i = 0; i < sizeof num; i++) {
num <<= CHAR_BIT;
num |= placeholder++;
}
memcpy(repr, &num, sizeof num);
placeholder = '1';
for (i = 0; i < sizeof num && endianness == big; i++)
if (repr != placeholder++)
endianness = little;
placeholder = '1';
for (i = 0; i < sizeof num && endianness == little; i++)
if (repr[sizeof num - 1 - i] != placeholder++)
endianness = unknown;
switch (endianness) {
case big:
printf("Big endian; ");
break;
case little:
printf("Little endian; ");
break;
default:
printf("Unknown endianness; ");
break;
}
printf("byte order: %.*s.\n", sizeof num, repr);
} else
puts("One-byte words: trivially both big-endian "
"and little-endian.");
return 0;
}
or '9' + 1, '9' + 2, ..., '0' + sizeof(int) are reasonable
characters, and bits aren't "shuffled" all around)?
#include <stdio.h>
#include <string.h>
#include <limits.h>
int main(void)
{
if (sizeof(int) > 1) {
unsigned int num = 0;
unsigned char repr[sizeof num];
unsigned int placeholder = '1';
size_t i;
enum {unknown, little, big} endianness = big;
for (i = 0; i < sizeof num; i++) {
num <<= CHAR_BIT;
num |= placeholder++;
}
memcpy(repr, &num, sizeof num);
placeholder = '1';
for (i = 0; i < sizeof num && endianness == big; i++)
if (repr != placeholder++)
endianness = little;
placeholder = '1';
for (i = 0; i < sizeof num && endianness == little; i++)
if (repr[sizeof num - 1 - i] != placeholder++)
endianness = unknown;
switch (endianness) {
case big:
printf("Big endian; ");
break;
case little:
printf("Little endian; ");
break;
default:
printf("Unknown endianness; ");
break;
}
printf("byte order: %.*s.\n", sizeof num, repr);
} else
puts("One-byte words: trivially both big-endian "
"and little-endian.");
return 0;
}