当前位置:首页 » 编程语言 » 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个字节,将其转换为数组除非特殊需要,没有必要。转换成短整型数组两个成员,转换成字符型数组,有四个成员。