Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c解释中的位运算_C_Bit Manipulation - Fatal编程技术网

c解释中的位运算

c解释中的位运算,c,bit-manipulation,C,Bit Manipulation,我有以下c代码: unsigned int a = 60; /* 60 = 0011 1100 */ int c = 0; c = ~a; /*-61 = 1100 0011 */ printf("c = ~a = %d\n", c ); c = a << 2; /* 240 = 1111 0000 */ printf("c = a << 2 = %d\n", c ); 无符号整数a=60;/*60 = 0011 1100 */ int c=0; c=~a/

我有以下c代码:

 unsigned int a = 60; /* 60 = 0011 1100 */
 int c = 0;
 c = ~a; /*-61 = 1100 0011 */
 printf("c = ~a = %d\n", c );
 c = a << 2; /* 240 = 1111 0000 */
 printf("c = a << 2 = %d\n", c );
无符号整数a=60;/*60 = 0011 1100 */
int c=0;
c=~a/*-61 = 1100 0011 */
printf(“c=~a=%d\n”,c);

c=a假设
int
只有8位宽。在您的系统上可能不是这样,它可能会使用16或32位来表示
int

在第一个示例中,所有的位都被反转。这实际上是一个直接的倒装,而不是二的补码:

1111 1111 1111 1111 1111 1111 1100 0011  (32-bit)
                    1111 1111 1100 0011  (16-bit)
在第二个示例中,将其左移2时,最高阶位仍然为零。你在评论中将数字描述为8位,这误导了你自己

0000 0000 0000 0000 0000 0000 1111 0000  (32-bit)
                    0000 0000 1111 0000  (16-bit)

假设
int
的宽度只有8位。在您的系统上可能不是这样,它可能会使用16或32位来表示
int

在第一个示例中,所有的位都被反转。这实际上是一个直接的倒装,而不是二的补码:

1111 1111 1111 1111 1111 1111 1100 0011  (32-bit)
                    1111 1111 1100 0011  (16-bit)
在第二个示例中,将其左移2时,最高阶位仍然为零。你在评论中将数字描述为8位,这误导了你自己

0000 0000 0000 0000 0000 0000 1111 0000  (32-bit)
                    0000 0000 1111 0000  (16-bit)

尽量避免对有符号整数进行逐位运算——这通常会导致未定义的行为


这里的情况是,获取无符号值并将其赋给有符号变量。对于
~60
来说,这是一个很好的例子。您将其视为-61,因为位模式
~60
也是-61的二补表示。另一方面,
60尽量避免对有符号整数进行逐位运算——这通常会导致未定义的行为



这里的情况是,获取无符号值并将其赋给有符号变量。对于
~60
来说,这是一个很好的例子。您将其视为-61,因为位模式
~60
也是-61的二补表示。另一方面,
60@Babbleshack不,它不能。这是关于这个人对整型的宽度所做的一个假设。@paddy干得好,我当时做了一个评论。我应该花更多时间思考这个问题对不起,我会删除它。
c
的值为
1111111111111111111111111100011
~
补充所有位,而不仅仅是第一行列出的位。正如@paddy所暗示的,int(可能)是4字节,而不是1字节。因此,
~a=1111111111111111111111111111100011
,但是
a并且请注意,正在打印的值
c
,被声明为有符号,而
%
格式代码用于有符号打印,因此
c
自然被解释为有符号2的补码。@Babbleshack不,它不能。这是关于这个人对整型的宽度所做的一个假设。@paddy干得好,我当时做了一个评论。我应该花更多时间思考这个问题对不起,我会删除它。
c
的值为
1111111111111111111111111100011
~
补充所有位,而不仅仅是第一行列出的位。正如@paddy所暗示的,int(可能)是4字节,而不是1字节。因此,
~a=1111111111111111111111111111111100011
,但是
a并且请注意,
c
,被打印的值,被声明为有符号的,
%
格式代码用于有符号的打印,因此
c
自然地被解释为有符号2的补码。ITYM ones补码?@PaulR no,~60是-61的两个补码表示,它是-61的一个补码表示-60@PaulR不二的补码。想想看,
~1
11111110
(扩展符号表示单词大小);那就是-2<代码>~60
为-61。重新考虑你的否决票?(还有,请评论一下)这不是未定义的行为——位操作是完全定义的。唯一“未定义”的是机器是1s补码还是2s补码,如果已知,则行为是完全定义的。我认为这里发生的事情是您混淆了C标准中关于右移负符号值的部分,这取决于实现。而左移任何有符号的值都有很好的定义。ITYM ones补码?@PaulR no,~60是-61的两个补码表示,它是-61的一个补码表示-60@PaulR不二的补码。想想看,
~1
11111110
(扩展符号表示单词大小);那就是-2<代码>~60
为-61。重新考虑你的否决票?(还有,请评论一下)这不是未定义的行为——位操作是完全定义的。唯一“未定义”的是机器是1s补码还是2s补码,如果已知,则行为是完全定义的。我认为这里发生的事情是您混淆了C标准中关于右移负符号值的部分,这取决于实现。而左移任何有符号的值都有很好的定义,不仅在较旧的系统上。在当今大多数8位和16位系统上,它仍然是16位,即。G在许多µC上,而不仅仅是在较旧的系统上。在当今大多数8位和16位系统上,它仍然是16位,即。G在许多µC上。