當前位置:首頁 » 編程語言 » c語言bit合並為一個位元組
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言bit合並為一個位元組

發布時間: 2023-05-14 18:49:17

c語言中,一個位元組到底有多少個字元

我真的搞不清楚你到底想問什麼,而且你有的表述也不準確嚴謹
所以只好把基本的單位先說下。

比特(bit)即一個二進制位 例如100011就是6比特

位元組(byte)這是計算機中數據類型最基本的單位了,8bit 組成1byte

字(word)銀悉兩個byte稱為一個word,所以字大小應該是16位bit,共兩位元組

雙字(double word 簡寫為DWORD)見名知意,兩個字,四個位元組,32bit

在C語言中,每種數鋒簡乎據類型都有其存儲長度。而且在特定的平台和特定的編譯器下是不一樣的。
由於WIN32平台用的很多,使用visual studio來做C程序的也有很多(我就是使用visual studio 6.0來學習C語言的),所以我說下這種情況(在Visual C++ 2005 中的)。

char 字元型 佔1byte 即8位,一個char型數據(例如:a、#、!之類的)用了1個位元組來存儲

unsigned char 無符號的字元型 佔1byte 即8位 它主要是為了能夠兼容擴展ASCII碼,由於 char 由8位表示表示範圍為 -128 - +127,無法表示帶上擴展ASCII碼總共256個字元所以如果把 8位中的最高位符號位也用來計數,就可以正好表示256個字元,unsigned char 表示範圍為 0 - 255 正好256個數可以對應包含擴展ASCII碼在內的共計256個ASCII字元

漢字在計算機中存儲是使用機內碼(一種數字編號)來存儲的,而常用漢字不過是幾萬個,如果用16位比特(即2的16此方等於65536)就可以表示了,所以漢字字元存儲使用了兩個位元組。每兩個位元組即16bit對應一個漢字。

int 整型數據 佔4byte 即32位,一個int型數據的長度用了4個位元組來存儲
short 短整型 佔2byte 即16位,兩個位元組。
long 長整型 佔4byte 即32為咐鬧,四個位元組
float 單精度浮點型 佔4byte 即32位,四個位元組
double 雙精度浮點型 佔8byte 即64位,八個位元組

假如你使用的不是 visual studio 編譯器 或者不是在win32環境下編程,以上的陳述可能就不對,我建議你查看一下 可以使用int i = sizeof(char)或者
sizeof(int)來看看i的值,如果i == 4,表示一個當前的數據類型佔四個位元組

② 一個c語言簡單問題,不知道哪錯了。就是想實現位元組數組變換成位組,然後又變成位元組數組。。

for(int i=0;i<bits;i++)
out[i]=((IN[i/8])<<(i%8))&128;

這個錯灶謹了,哪辯燃應李虛該是out[i]=(((IN[i/8])<<(i%8))&(1<<i%8))1:0;

③ c語言,空間如何合並,比如兩個位元組和三個位元組的空間,如何合並

方法一:新建一個5位元組空間,把原值復制進去,釋放原空間

方法二:擴展其中的一個空間,把另一個空間的值復制進去。

④ C語言中如何將位與它所在位元組捆綁

#define (if(X){cbi(X);}) \
(if( bit_is_set(PORTB,X) {cbi(PORTB,X);} ))

上面這樣寫行不?是單片機的操作吧。呵呵。

附上宏定義的知識,你看看吧。

C語言宏定義總結
轉渣帶自:http://topcool99.ycool.com/post.1797687.html

宏定義了一個代表特定內容的標識符。
預處理過程會把源代碼中出現的宏標識符替換成宏定義時的值。
宏最常見的用法是定義代表某個值的全局符號。
宏的第二種用法是定義帶歷梁汪參數的宏,這樣的宏可以象函數一樣被調用,但它是在調用語句處展開宏,並用調用時的實際參數來代替定義中的形式參數。

1.#define指令
#define MAX_NUM 10
int array[MAX_NUM];
for(i=0;i<MAX_NUM;i++) /*……*/
#define VERSION "Version 1.0 Copyright(c) 2003"
2.帶參數的#define指令
#define IS_EVEN(n) ((n)%2==0)
#define MAX(x,y) ((x)>(y) ? (x) :(y))
#define Cube(x) (x)*(x)*(x)
可以是任何數字表達式甚至函數調用來代替參數x。
3.#運算符
#的功能是將其後面的宏參數進行字肢仔符串化操作(Stringfication),簡單說就是在對它所引用的宏變數通過替換後在其左右各加上一個雙引號。例如:
#define _STR(s) #s
#define WARN_IF(EXP) \
do{ if (EXP) \
fprintf(stderr, "Warning: " #EXP "\n"); } \
while(0)
那麼實際使用中會出現下面所示的替換過程:
WARN_IF (divider == 0);

被替換為

do
{
if (divider == 0)
fprintf(stderr, "Warning" "divider == 0" "\n");
} while(0);
這樣每次divider(除數)為0的時候便會在標准錯誤流上輸出一個提示信息。

再例如下面的例子:
#define FILL(a) {a, #a}

enum IDD{OPEN, CLOSE};
typedef struct MSG{
IDD id;
const char * msg;
}MSG;

MSG _msg[] = {FILL(OPEN), FILL(CLOSE)};
相當於:
MSG _msg[] = {{OPEN, "OPEN"},
{CLOSE, "CLOSE"}};

4.##運算符
##運算符用於把參數連接到一起。
預處理程序把出現在##兩側的參數合並成一個符號。
看下面的例子:

#define NUM(a,b,c) a##b##c
#define STR(a,b,c) a##b##c

main()
{
printf("%d\n",NUM(1,2,3));
printf("%s\n",STR("aa","bb","cc"));
}

最後程序的輸出為:
123
aabbcc
再看下面的例子:
struct command
{
char * name;
void (*function) (void);
};

#define COMMAND(NAME) { NAME, NAME ## _command }

// 然後你就用一些預先定義好的命令來方便的初始化一個command結構的數組了:

struct command commands[] = {
COMMAND(quit),
COMMAND(help),
...
}

COMMAND宏在這里充當一個代碼生成器的作用,這樣可以在一定程度上減少代碼密度,間接地也可以減少不留心所造成的錯誤。我們還可以n個##符號連接 n+1個Token。比如:
#define LINK_MULTIPLE(a,b,c,d) a##_##b##_##c##_##d

typedef struct _record_type LINK_MULTIPLE(name,company,position,salary);
// 這里這個語句將展開為:
// typedef struct _record_type name_company_position_salary;
5.特殊的宏
#error指令將使編譯器顯示一條錯誤信息,然後停止編譯。
#line指令可以改變編譯器用來指出警告和錯誤信息的文件號和行號。
#pragma指令沒有正式的定義。編譯器可以自定義其用途。典型的用法是禁止或允許某些煩人的警告信息。
...在C宏中稱為Variadic Macro,也就是變參宏。

Compiled on Dec 23 1996 at 22:18:48

6.預定義宏
__LINE__ 被編譯的文件的行數
__FILE__ 被編譯的文件的名字
__DATE__ 編譯的日期(格式"Mmm dd yyyy")
__TIME__ 編譯的時間(格式"hh:mm:ss")
__STDC__ 如果編譯器接受標准C,那麼值為1

printf("Compiled on %s at %s\n", __DATE__, __TIME__);

每次程序開始執行,程序都會顯示,用於確認版本:
Compiled on Dec 23 1996 at 22:18:48
下面的宏可以幫助我們查明錯誤的根源:

#define CHECK_ZERO(divisor) \
if (divisor == 0) \
printf("*** Attempt to divide by zero on line %d " \
"of file %s ***\n",__LINE__, __FILE__)

CHECK_ZERO宏應該在除法運算前被調用:
CHECK_ZERO(j);k = i / j;
如果j是0,會顯示出如下形式的信息:
*** Attempt to divide by zero on line 9 of file FOO.c ***
通用的、用於錯誤檢測的宏——assert宏;

7.注意
宏名和參數的括弧間不能有空格;
宏替換只作替換,不做計算,不做表達式求解;
函數調用在編譯後程序運行時進行,並且分配內存。宏替換在編譯前進行,不分配內存;
函數只有一個返回值,利用宏則可以設法得到多個值;
宏展開使源程序變長,函數調用不會;
宏展開不佔運行時間,只佔編譯時間,函數調用占運行時間(分配內存、保留現場、值傳遞、返回值);
使用條件編譯可以使目標程序變小,運行時間變短;
預編譯使問題或演算法的解決方案增多,有助於我們選擇合適的解決方案。

⑤ c語言怎麼處理2進制位和1個位元組的轉換

int x = char a &0x3f 後6位
int y =char a &0x40
int z = char a&0x80

⑥ C語言 如何把一個字元串中相連的兩個數字轉化為一個位元組

不知道你的意思,但是如果你要把字元串「313233343536」,變成數字數組的話,你可以這樣變化的
假設
*P=「「敬兄313233343536」
在定義一個數組a[];
for(i=0;i<12;i++)
{
a[i]=*P+0;/州枝/因為是字元,所以根據ASCii碼表,要轉換成數字
P++;
}
這樣就可以轉化冊稿敏成數字數組了。

⑦ 如何用c語言把兩個8位數據變成一個8位數據

unsignedintcompressUInt32(unsignedintfirst,unsignedintsecond)
{
autodata=newunsignedchar[4];

data[0]=0xff&褲猛歷(first>>8);data[1]=0xff&first;
data[2]=0xff&(second>>8);data[3]=0xff&second;

return*static_cast<unsignedint*>((void*)data);
}

這是將兩個無符號整數存儲到一胡搜個無符號整數中的方法,相當於將 8位元組的知頌數據存儲到了4位元組中

⑧ c語言中如何定義一個bit

1、在c語言中定義bit型變數,可以使用位域來自定義。
位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度;

2、示例:通過位域來計算IEEE754浮點數標准中,單精度浮點數的最大值、最小值以及最小弱規范數。

#include<stdio.h>
typedefstructFP_SINGLE
{
unsigned__int32fraction:23;
unsigned__int32exp:8;
unsigned__int32sign:1;
}fp_single;
intmain()
{
floatx;
fp_single*fp_s=(fp_single*)&x;
fp_s->sign=0;
fp_s->exp=0xfe;
fp_s->fraction=0x7fffff;
printf("float最大數:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0x1;
fp_s->fraction=0x0;
printf("float最小數:%le ",(double)x);
fp_s->sign=0;
fp_s->exp=0;
fp_s->fraction=0x1;
printf("float最小弱規范數:%le ",(double)x);
return0;
}

⑨ C51編程中如何把兩個位元組合並成一個字

你吵旁可以這樣做:
char a,b;
int c;
c=a<<8 + b;
或者 c=a+b<<8;

你得知道那個是高擾碰雀位元組,那個是緩早低位元組。

⑩ 怎麼用c語言把採集的連續12bit數據轉換成位元組流

UINT類型是unsigned int另一種定義形式,對應於32位無符號整數,佔用4個位元組,將其轉換為數組除非特殊需要,沒有必要。轉換成短整型數組兩個成員,轉換成字元型數組,有四個成員。