㈠ 初学者问一个c语言的问题,关于位运算。
把一个字节分成了三个更小的部分,a一位,b三位,c四位。
pbit->a=0就是把a赋值为0;
pbit->b&=3就是pbit->b=pbit->b&3,3的二进制为011,即保留二进制b的后两位;
pbit->c|=1同上pbit->c=pbit->c|0001,按位与0001做"或"操作.
㈡ c语言 位域长度
这个主要还是要看编译器以及程序的运行环境。例如普通32位的环境中,位域可以定义为32bit,超过32bit就会报错。
我的理解是LZ书上看到的位域不允许跨2字节是由于运行环境是8bit的。因此在单片机编程中可以定义16bit的ul类型(该单片机的位宽应该是大于等于16bit的)。
我在自己的64位系统上编写了类似的代码,把编译器位宽设置为64位,发现位域就可以达到64bit,超过64bit就会报错。
㈢ c语言/取值范围
C语言中int的取值范围为:-2147483648 ~ 2147483647
解释如下:
int类型在C语言中占4个字节,即32个二进制位。
当表示正数时,最高位为符号位(符号位为0),最大的正数是 0111 1111 1111 1111 1111 1111 1111 1111 即2^31 -1 = 2147483647
当表示负数时,最高位为符号位(符号位为1),最小的负数是 1000 0000 0000 0000 0000 0000 0000 0000 而在计算机中是以补码的形式存储的,C语言规定 1000 0000 0000 0000 0000 0000 0000 0000 的补码为-2147483648
所以C语言中int的取值范围为:-2147483648 ~ 2147483647
㈣ c语言 结构体位域问题
c存在第三个字节
sizeof结构体,这个要看结构体内变量是如何定义的,结构体存放数据有个对齐原则,找到占用最大字节的变量,然后都向它对齐,比如bool和char类型占用一个字节,short占两个字节,int,float为4个字节,double为八个字节。
定义的顺序不同,sizeof的结果不同。我给你举个例子。
structA{
inta;
charb;
charc;
};
sizeof(A)应该为4+1+1,但是需要对齐,所以这个值就是8
图2
这个是struct B的变量存储
㈤ 关于C语言里的位域赋值问题
c在结构提中定义位,是无符号整型,unsigned int。你定义成int那么默认为有符号整型了。
虽然可以定义成int类型,但是一般没人这样去做。因为有更好的方法去这样做。
你的应该改成
typedef struct _ss_
{
unsigned int a:2;
unsigned int b:2;
unsigned int c:2;
unsigned int d:1;
}ss;
ss ff;
int uu
ff.a=1;
ff.b=2;
ff.c=3;
ff.d=4;
uu = ff.a;
uu = ff.b;
uu = ff.c;
uu = ff.d;
㈥ c语言位域问题
用
unsigned int a2 : 1;
你只有一位,bit 1 是符号位。
int a2 : 1; 是有符号数,解释为补码,成了 -1.
int a2 : 2; // 如果用2位,1 就是 +1 了。用2位,则 1位符号位(解释为补码),另一位数字位。
㈦ 关于c语言的“位域”。
以a为例,a定义为该struct的0~2 bits,其取值就是b000~b111,即(0~7)
b则是,3~6 bits,其取值就是b0000~b1111,即(0~15)
详见http://ke..com/view/1256879.htm
㈧ 关于C语言中位域的问题
不是8位啦 是位域长不能超过变量指定类型
比如int a; 如果int长度为8位 则范围不能大于8
其实一般来说int长度是16位 并用根据编译器和具体机器而变动
上面的程序里uint32的长度是32(根据名字猜的)
所以只要范围不大于32即可
㈨ c语言 关于位域的使用
一、位域
有些信息在存储时,并不需要占用一个完整的字节,
而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1
两种状态,
用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,
并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。
这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:
struct
位域结构名
{
位域列表
};
其中位域列表的形式为:
类型说明符
位域名:位域长度
如
struct
bs
{
int
a:8;
int
b:2;
int
c:6;
};
位域变量的说明与结构变量说明的方式相同。
可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:
struct
bs
{
int
a:8;
int
b:2;
int
c:6;
}data;
说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:
1.
一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:
struct
bs
{
unsigned
a:4
unsigned
:0
/*空域*/
unsigned
b:4
/*从下一单元开始存放*/
unsigned
c:4
}
在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
2.
由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
3.
位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:
struct
k
{
int
a:1
int
:2
/*该2位不能使用*/
int
b:3
int
c:2
};
从以上分析可以看出,位域在本质上就是一种结构类型,
不过其成员是按二进位分配的。
二、位域的使用
位域的使用和结构成员的使用相同,其一般形式为:
位域变量名·位域名
位域允许用各种格式输出。
main(){
struct
bs
{
unsigned
a:1;
unsigned
b:3;
unsigned
c:4;
}
bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}
上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。
程序的9、10、11三行分别给三个位域赋值。(
应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=",
该行相当于:
pbit->b=pbit->b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。同样,程序第16行中使用了复合位运算"|=",
相当于:
pbit->c=pbit->c|1其结果为15。程序第17行用指针方式输出了这三个域的值。
㈩ C语言int的取值范围
C语言int的取值范围在32/64位系统中都是32位,范围为-2147483648~+2147483647,无符号情况下表示为0~4294967295。
C/C++编程语言中,int表示整型变量,是一种数据类型,用于定义一个整型变量,在不同编译环境有不同的大小,不同编译运行环境大小不同。
C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。
基本数据类型:
void:声明函数无返回值或无参数,声明无类型指针,显示丢弃运算结果。(C89标准新增)
char:字符型类型数据,属于整型数据的一种。(K&R时期引入)
int:整型数据,表示范围通常为编译器指定的内存字节长。(K&R时期引入)
float:单精度浮点型数据,属于浮点数据的一种。(K&R时期引入)
double:双精度浮点型数据,属于浮点数据的一种。(K&R时期引入)
_Bool:布尔型(C99标准新增)
_Complex:复数的基本类型(C99标准新增)
_Imaginary:虚数,与复数基本类型相似,没有实部的纯虚数(C99标准新增)
_Generic:提供重载的接口入口(C11标准新增)
(10)c语言位域的取值扩展阅读:
1989年,ANSI发布了第一个完整的C语言标准——ANSI X3.159—1989,简称“C89”,不过人们也习惯称其为“ANSI C”。
C89在1990年被国际标准组织ISO(International Standard Organization)一字不改地采纳,ISO官方给予的名称为:ISO/IEC 9899,所以ISO/IEC9899: 1990也通常被简称为“C90”。
1999年,在做了一些必要的修正和完善后,ISO发布了新的C语言标准,命名为ISO/IEC 9899:1999,简称“C99”。
在2011年12月8日,ISO又正式发布了新的标准,称为ISO/IEC9899: 2011,简称为“C11”。