考慮以下 unaligned_get32
函式的實作:
#include <stdint.h>
#include <stddef.h>
uint8_t unaligned_get8(void *src) {
uintptr_t csrc = (uintptr_t) src;
uint32_t v = *(uint32_t *) (csrc & 0xfffffffc);
v = (v >> (((uint32_t) csrc & 0x3) * 8)) & 0x000000ff;
return v;
}
uint32_t unaligned_get32(void *src) {
uint32_t d = 0;
uintptr_t csrc = (uintptr_t) src;
for (int n = 0; n < 4; n++) {
uint32_t v = unaligned_get8((void *) csrc);
v = v << (n * 8);
d = d | v;
csrc++;
}
return d;
}
uint32_t unaligned_get32(void *src)
uintptr_t csrc = (uintptr_t) src
v & 0x000000ff = 0xef
csrc++
v & 0x000000ff = 0xbe
csrc++
v & 0x000000ff = 0xad
csrc++
v & 0x000000ff = 0xde
d = 0xdeadbeef
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t a = 0xdeadbeef;
printf("a = %x\n", a);
printf("&a = %p\n", &a);
a = a >> 8;
uint8_t *b = &a;
printf("\nb = %p\n", b);
printf("*(b) = %x\n", *(b));
printf("*(b+1) = %x\n", *(b+1));
printf("*(b+2) = %x\n", *(b+2));
return 0;
}
$ ./main
a = deadbeef
&a = 0x7ffec2dc29d4
b = 0x7ffec2dc29d4
*(b) = be
*(b+1) = ad
*(b+2) = de
#SMC
Nov 30, 2023你所不知道的 C 語言: 開發工具和規格標準 你所不知道的C語言:指標篇 object 3.14 提到 object 是在執行環境中資料儲存的區域,其內容可以表示值 type 6.2.5 Types are partitioned into object types (types that fully describe objects), function types (types that describe functions), and incomplete types (types that describe objects but lack information needed to determine their sizes).
May 10, 2022contributed by < chengingx > 測驗 1 〈UNIX 作業系統 fork/exec 系統呼叫的前世今生〉提到 clone 系統呼叫,搭配閱讀〈Implementing a Thread Library on Linux〉,以下嘗試撰寫一套使用者層級的執行緒函式庫,程式碼可見: readers.c 預期執行輸出: (順序可能會變異) Reader process in Reader process out Reader process in
Apr 19, 2022測驗題目 測驗 1 延伸第 3 週測驗題的測驗 7,已知輸入必為大於 0 的數值 (即 x > 0),以下程式碼可計算 $[log_2{x}]$,也就是 ceil 和 log2 的組合並轉型為整數: int ceil_log2(uint32_t x) { uint32_t r, shift; x--;
Apr 7, 2022or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up