Skip to content

Literals

cppreference Literals

Example

char literal:

这个例子是源自creference Objects and alignment#Strict aliasing

#include <cstdio>

int main()
{
    int i = 7;//最低有效位是0x7
    char* pc = (char*) (&i);
    if (pc[0] == '\x7') // aliasing through char is ok
        puts("This system is little-endian");
    else
        puts("This system is big-endian");

}

integer literal

这个例子源自:wikipedia Endianness

#include "stdint.h"
#include "stdio.h"

int main(void)
{
    union u_t
    {
        uint8_t u8;
        uint16_t u16;
        uint32_t u32;
        uint64_t u64;
    } u = { .u64 = 0x4A };
    puts(u.u8 == u.u16 && u.u8 == u.u32 && u.u8 == u.u64 ? "true" : "false");
}
// gcc test.c

pzemtsov A bug story: data alignment on x86

_Bool check_ip_header_sum (const char * p, size_t size)
{
    const uint32_t * q = (const uint32_t *) p; // 不符合strict aliasing,undefined behavior
    uint64_t sum = 0;

    sum += q[0];
    sum += q[1];
    sum += q[2];
    sum += q[3];
    sum += q[4];

    for (size_t i = 5; i < size / 4; i++) {
        sum += q[i];
    }

    do {
        sum = (sum & 0xFFFF) + (sum >> 16);
    } while (sum & ~0xFFFFL);

    return sum == 0xFFFF;
}