C語言 資料的位級表示及操作
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
typedef unsigned char* byte_pointer;
/*表示: 高位->低位(和機器採用大端法和小端法有關) 本例機器採用小端法表示資料*/
void show_bytes(byte_pointer word,size_t len) {
printf("0x");
for (int i = len - 1; i >= 0; --i) {
printf("%.2x",word[i]);
}
printf("\n");
}
void show_bits(byte_pointer word,size_t len) {
for (int i = len - 1; i >= 0; --i) {
unsigned int byte = word[i];
unsigned int mask = 128;
for (int j = 0; j < 8; ++j) {
if (j % 8 == 0)
printf("[");
bool flag = byte & (mask >> j);
if (flag)
printf("1");
else
printf("0");
if ((j + 1) % 8 == 0)
printf("] ");
}
}
printf("\n");
}
int main() {
int32_t a = 12345;
printf("signed a 12345:\n");
show_bytes((byte_pointer)&a,sizeof(int32_t));
show_bits((byte_pointer)&a,sizeof(int32_t));
uint32_t ua = 12345;
printf("unsigned int a 12345:\n");
show_bytes((byte_pointer)&ua,sizeof(uint32_t));
show_bits((byte_pointer)&ua,sizeof(uint32_t));
int32_t negative_a = -12345;
printf("negative a -12345:\n");
show_bytes((byte_pointer)&negative_a,sizeof(int32_t));
show_bits((byte_pointer)&negative_a,sizeof(int32_t));
/* left */
printf("a << 3 %d\n",a << 3);
int32_t la = a << 3;
show_bytes((byte_pointer)&la,sizeof(int32_t));
show_bits((byte_pointer)&la,sizeof(int32_t));
printf("ua << 3 %u\n",ua << 3);
uint32_t lua = ua << 3;
show_bytes((byte_pointer)&lua,sizeof(uint32_t));
show_bits((byte_pointer)&lua,sizeof(uint32_t));
printf("negative a << 3 %d\n",negative_a << 3);
int32_t negative_la = negative_a << 3;
show_bytes((byte_pointer)&negative_la,sizeof(int32_t));
show_bits((byte_pointer)&negative_la,sizeof(int32_t));
/*-----------------------------------------------------*/
/* right */
printf("a >> 3 %d\n",a >> 3);
int32_t ra = a >> 3;
show_bytes((byte_pointer)&ra,sizeof(int32_t));
show_bits((byte_pointer)&ra,sizeof(int32_t));
printf("ua >> 3 %u\n",ua >> 3);
uint32_t rua = ua >> 3;
show_bytes((byte_pointer)&rua,sizeof(uint32_t));
show_bits((byte_pointer)&rua,sizeof(uint32_t));
printf("negative a >> 3 %d\n",negative_a >> 3);
int32_t negative_ra = negative_a >> 3;
show_bytes((byte_pointer)&negative_ra,sizeof(int32_t));
show_bits((byte_pointer)&negative_ra,sizeof(int32_t));
/*-----------------------------------------------------*/
/*******************************************************
為何資料右移分邏輯右移和算術右移而左移只有邏輯左移
由下例可知c語言左右移是為了得到乘除的效果,而大部分邏輯右移並不能直接得到 正確結果,故出現算數右移能解決這一問題,邏輯左移其實能滿足這一要求,而下例 出現的反常情況,其實是溢位導致的
*******************************************************/
int32_t c = 1 << 31;
printf("c: %d\n",c);
show_bytes((byte_pointer)&c,sizeof(int32_t));
show_bits((byte_pointer)&c,sizeof(int32_t));
printf("c << 1 %d\n",c << 1);
c = c << 1;
show_bytes((byte_pointer)&c,sizeof(int32_t));
show_bits((byte_pointer)&c,sizeof(int32_t));
}
執行:
相關文章
- C語言位操作C語言
- 正規表示式及多語言操作指南
- C語言 僅用位設定和位清除表示位運算C語言
- C語言位運算子及常見用法C語言
- 使用C#語言操作ADO資料庫 (轉)C#資料庫
- 資料庫操作語言DDL資料庫
- go 語言位操作庫 bitsetGo
- C語言位運算C語言
- C語言02-常量、二進位制、資料型別C語言資料型別
- C語言-指標操作C語言指標
- C語言檔案操作C語言
- C語言(檔案操作)C語言
- SQL資料庫操作語言DCLSQL資料庫
- C語言資料型別C語言資料型別
- c語言的基本資料型別C語言資料型別
- 資料結構c語言實現順序表基本操作資料結構C語言
- C語言資料結構:雙向連結串列的增刪操作C語言資料結構
- 資料庫學習(二)資料操作語言:資料庫
- 關於C語言的位運算子C語言
- C語言第三篇:C語言資料型別及各資料型別所佔記憶體位元組數C語言資料型別記憶體
- C語言版資料結構及演算法_快速排序C語言資料結構演算法排序
- 福大pta--C語言--基本資料型別與表示式--判斷題C語言資料型別
- C語言練習——資料加密C語言加密
- C語言期末複習資料C語言
- C語言(基本資料型別)C語言資料型別
- C語言資料結構:鏈式佇列的建立及其出入隊操作C語言資料結構佇列
- 基於C#語言Oracle.ManagedDataAccess操作Oracle資料庫連線語句C#Oracle資料庫
- C語言資料結構:單向迴圈連結串列的增刪操作C語言資料結構
- C語言資料結構:雙向迴圈連結串列的增刪操作C語言資料結構
- c語言檔案操作相關C語言
- C語言實現出入棧操作C語言
- C 語言的 互斥鎖、自旋鎖、原子操作
- C語言關於檔案操作的命令C語言
- C語言 列舉資料型別C語言資料型別
- C語言學習資料(轉載)C語言
- java語言操作Oracle資料庫中的CLOB資料型別 (轉)JavaOracle資料庫資料型別
- 圖的深度遍歷(C語言)鄰接矩陣表示C語言矩陣
- Oracle資料操作和控制語言詳解(轉)Oracle