当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?
指针的大小是否与其指向的类型的大小相同,或者指针总是具有固定大小?例如...
int x = 10;
int * xPtr = &x;
char y = 'a';
char * yPtr = &y;
std::cout << sizeof(x) << "\n";
std::cout << sizeof(xPtr) << "\n";
std::cout << sizeof(y) << "\n";
std::cout << sizeof(yPtr) << "\n";
Run Code Online (Sandbox Code Playgroud)
这会是什么输出?会sizeof(xPtr)返回4并sizeof(yPtr)返回1,或者2指针实际上会返回相同的大小吗?我问这个的原因是因为指针存储的是存储器地址而不是它们各自存储的地址的值.
我只是想问一下我的方法是否正确,从小端到大端转换,只是为了确保我理解差异.
我有一个存储在little-endian中的数字,这里是数字的二进制和十六进制表示:
?0001 0010 0011 0100 0101 0110 0111 1000?
?12345678?
Run Code Online (Sandbox Code Playgroud)
在big-endian格式中,我认为应该交换字节,如下所示:
1000 0111 0110 0101 0100 0011 0010 0001
?87654321
Run Code Online (Sandbox Code Playgroud)
它是否正确?
此外,下面的代码尝试执行此操作但失败.有什么明显的错误或者我可以优化一些东西吗?如果代码对于此转换有害,请解释原因并展示执行相同转换的更好方法吗?
uint32_t num = 0x12345678;
uint32_t b0,b1,b2,b3,b4,b5,b6,b7;
uint32_t res = 0;
b0 = (num & 0xf) << 28;
b1 = (num & 0xf0) << 24;
b2 = (num & 0xf00) << 20;
b3 = (num & 0xf000) << 16;
b4 = (num & 0xf0000) << 12;
b5 = (num & 0xf00000) << 8;
b6 = (num & 0xf000000) …Run Code Online (Sandbox Code Playgroud)