相关疑难解决方法(0)

是否在C中移位了带符号的短未定义行为的有符号位?

我听说转换成整数的有符号位,即

int test = INT_MAX;
test = (test<<1) + 1;
Run Code Online (Sandbox Code Playgroud)

由于测试大于INT_MAX,因此是未定义的行为.但是在签名的短变量中会遇到这种行为,即

short test1 = SHRT_MAX;
test1 = (test1<<1) + 1;
Run Code Online (Sandbox Code Playgroud)

目前我没有遇到任何相关文件.

编辑:我知道未定义的行为将导致整数的情况,但不是短的.

c bit-shift undefined-behavior integer-promotion

4
推荐指数
1
解决办法
88
查看次数

该位操作符代码是副作用(在K&R C书中使用的术语)还是机器相关的处理指令?

这是两个似乎在做相同事情的代码,但事实并非如此。运行和将输出与跟踪进行比较时,这两个不同的输出产生了混淆,因为似乎第一个代码处理是与机器相关的代码。请阅读两个代码

代码1:-

unsigned char c=(((~0 << 3) >> 4) << 1);
printf("%d", c);
Run Code Online (Sandbox Code Playgroud)

输出:-254

代码2:-

unsigned char c=(~0 << 3);
c >>= 4;
c <<= 1;
printf("%d", c);
Run Code Online (Sandbox Code Playgroud)

输出:-。30

上面代码的输出是不同的。

不仅此代码(第一个代码)引起混淆,而且涉及单行多位按位移位运算符的所有类型的代码都产生意外结果。

第二个代码执行正确。

请在您的计算机上运行此代码并验证以上输出

与/或

解释为什么这些输出不相同。

要么

最后,我们必须了解我们不应在代码中应用多个按位移位运算符。

谢谢

c bit-manipulation

4
推荐指数
1
解决办法
91
查看次数

PIC 18F45K42:如何将4个字节组合为Int?

我正在为 PIC 18F45K42 编写代码,以从 HCSD 卡读取 .wav 文件。我正在使用 MPLAB X IDE v5.20 和 XC v2.05。我正在使用 FATF 库从卡上读取数据。

我可以从卡上读取数据并获得良好的结果,直到组合代表 .wav 文件大小的 4 个字节。

#define BYTE_TO_BINARY_PATTERN "%c%c%c%c%c%c%c%c"
#define BYTE_TO_BINARY(byte)  \
(byte & 0x80 ? '1' : '0'), \
(byte & 0x40 ? '1' : '0'), \
(byte & 0x20 ? '1' : '0'), \
(byte & 0x10 ? '1' : '0'), \
(byte & 0x08 ? '1' : '0'), \
(byte & 0x04 ? '1' : '0'), \
(byte & 0x02 ? …
Run Code Online (Sandbox Code Playgroud)

c embedded wav microchip pic18

3
推荐指数
1
解决办法
1053
查看次数

在 C 中,如果我们在同一操作中将位左移超出范围并再次右移值会发生什么

在 unsigned short 的情况下,我将 383 向左移动了 11 个位置,然后在同一条指令中再次将其向右移动了 15 个位置,我预计该值为 1 但它是 27。但是当我在不同的指令中同时使用这两个移位操作时之后(先左移,然后右移),输出为 1。这是一个示例代码:-

unsigned short seed = 383;
printf("size of short: %d\n",sizeof(short));
unsigned short seedout,seed1,seed2,seed3,seedout1;
seed1 = (seed<<11);
seed2 = (seed1>>15);
seed3 = ((seed<<11)>>15);
printf("seed1 :%d\t  seed2: %d\t seed3: %d\n",seed1,seed2,seed3);
Run Code Online (Sandbox Code Playgroud)

它的输出是:

size of short: 2
seed1 :63488      seed2: 1       seed3: 23    
seedout1: 8     seedout :382
Process returned 0 (0x0)   execution time : 0.154 s
Run Code Online (Sandbox Code Playgroud)

c

3
推荐指数
3
解决办法
1346
查看次数

为什么 sizeof 运算符对某些表达式的工作方式不同?

我知道像x++或函数调用这样的表达式不会在 sizeof 运算符中计算。

当我运行下面的代码时,我得到了4 8 8输出。有人可以向我解释第 6、7、8 行实际发生了什么吗?

#include <stdio.h>
int main()
{
  int x=10;
  double y=10.0;
  printf("%d ",sizeof (x=x+y));    
  printf("%d ",sizeof (y=x+y));     
  printf("%d ",sizeof (x+y));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我发现如果表达式=隐式地(如预增量)或显式地(如x=x+y)包含赋值运算符,则表达式不会在sizeof运算符中求值。

我对吗?

c operators sizeof

3
推荐指数
1
解决办法
139
查看次数

为什么 C 中的 sizeof 运算符在 NOT 操作的情况下会给出不同的输出?

我是编程新手,被介绍给sizeofC的操作符。 玩它,我发现了以下有趣的事情:

long long int a = 100;

printf("%d %d\n", sizeof(a), sizeof(!a));  // Output : 8 1
Run Code Online (Sandbox Code Playgroud)

我知道sizeof(a)(在我的系统中)是 8。但我不明白为什么 sizeof(!a)变成 1。

是因为 !a 变为 0,存储为char吗?

此外,以下代码更增加了我的困惑:

long long int a = 100;
char b = 9;

printf("%d %d %d %d\n", sizeof(a), sizeof(b), sizeof(a+b), sizeof(!a+b)); // Output : 8 1 8 4
Run Code Online (Sandbox Code Playgroud)

谁能解释一下,这里发生了什么?由于类型转换,char 应该转换为 long long int,对吗?如果是这样,我理解8 1 8输出的部分。但是为什么 sizeof(!a+b) 是 4?

根据This answersizeof()返回size_t4 个字节的大小。但无法从中得到我的查询的答案。

c memory

3
推荐指数
1
解决办法
71
查看次数

转换有符号整数与短整数时符号扩展不一致

int main(){
  signed int a = 0b00000000001111111111111111111111; 
  signed int b = (a << 10) >> 10;
  // b is: 0b11111111111111111111111111111111

  signed short c = 0b0000000000111111; 
  signed short d = (c << 10) >> 10;
  // d is: 0b111111

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

假设int是 32 位和short16 位,

为什么会b得到符号扩展但d没有得到符号扩展?我已经在 x64 上用 gdb 测试过这个,用 gcc 编译。

为了获得short符号扩展,我不得不使用两个单独的变量,如下所示:

  signed short f = c << 10;
  signed short g = f >> 10;
  // g is: …
Run Code Online (Sandbox Code Playgroud)

c

3
推荐指数
1
解决办法
69
查看次数

printf%f如何在32位浮点数上运行

%fprintf格式代码被指定为上式的值操作double[ .但是,一个简单的测试程序表明它也可以与类型的值一起使用float.这是如何运作的?

具有整数类型(例如intlong long int)的等效情况"起作用",因为在小端机器上,32位整数的低位字节恰好与64位整数的低位字节重叠,所以只要高位为0,你会得到"正确"的答案.

但是,这不可能是对的情况下floatdouble,因为浮点格式都没有这样的互换.如果没有将(相当复杂的)转换为其他格式,您根本无法将浮点值打印为double.通过类型惩罚尝试这样做只会打印垃圾.

最重要的是,printf是可变的.编译器在编译时不一定知道将使用什么格式说明符,只知道参数的类型.因此,我唯一可以推测的是,传递给可变函数的所有 float值都将double无条件地升级到.但令我难以置信的是,我可以用C语言编程很长时间而且不知道这一点.

C如何在这里进行隐式强制?

资源:

#include <stdio.h>
#include <math.h>

int main() {
  float x[2] = {M_PI, 0.0};
  printf("value of x: %.16e\n", x[0]);
  printf("size of x: %lu\n", sizeof(x[0]));

  double *xp = (double *)&x[0];
  printf("value of *xp: %.16e\n", *xp);
  printf("size of *xp: %lu\n", sizeof(*xp));

  double y = M_PI;
  printf("value of y: %.16e\n", y);
  printf("size of y: …
Run Code Online (Sandbox Code Playgroud)

c printf variadic-functions

2
推荐指数
2
解决办法
192
查看次数

不是按位运算符会破坏无符号整数?

我正在尝试让C将无符号整数转换为无符号整数。 如何在不将C解释为二进制补码的情况下反转无符号数字的位?

每当我有一个无符号整数并将其用作按位NOT运算符的操作数时,它将根据2的补数求值为负数。但是根据定义,我使用的是无符号整数,即不应该带有符号的数字

下面是我的沙盒代码。我目前正在使用GCC版本9.1.1。

#include <stdio.h>
#include <stdint.h>

int main(){
   uint8_t x = 1;//0000 0001
   printf("NOT(%d) == %d", x, ~x);//1111 1110
}

Run Code Online (Sandbox Code Playgroud)

我想要254(1111 1110)的输出,但是C将值解释为二进制补码,所以我得到-2。有没有办法让我将C 解释为二进制补码?

c types bit-manipulation unsigned-integer

2
推荐指数
1
解决办法
66
查看次数

将 unsigned int(通过负数)分配给 signed long long 时的意外值

我碰巧遇到了一个奇怪的问题,请看下面的代码:

#include <stdio.h>

int main() {
    unsigned char a = 10;
    unsigned int b = 10;

    long long x = -a;
    long long y = -b;

    printf("x = %lld, y = %lld\n", x, y);
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

输出:

x = -10, y = 4294967286
Run Code Online (Sandbox Code Playgroud)

如您所见,当我分配-by(long long) 时,它给出了错误的结果,但 x 的值符合预期。

阅读 asm 代码后,我发现当将负的 unsigned char 分配给 long long 时,编译器生成一条cdqe指令(见第 +25 行)将符号扩展为 rax,而当 unsigned int 为 long 时它不会做同样的事情长。

我知道我们得到这个值的原因4294967286是 rax 的高 32 位都为零,rax …

c assembly

2
推荐指数
1
解决办法
71
查看次数