gpt4 book ai didi

C 按位运算符

转载 作者:行者123 更新时间:2023-11-30 17:19:38 26 4
gpt4 key购买 nike

我正在使用 CodeVisionAVR 评估 V2.05.0,它使用 C 编译器引用。当我尝试此代码时遇到问题:

unsigned int n;
long int data;
data|=(1<<n);

问题是当 n 大于 15 时,数据值不会改变。虽然当我尝试时:

data|=(1<<16);

结果是正确的。如有任何帮助请。

最佳答案

在您的代码中,1 的类型(一如既往)是int。因此,如果 sizeof (int) 小于 sizeof (long),那么按理说你不能对所有 int 进行移位long 中的位。

解决方案当然是使用(无符号)长常量:

data |= 1UL << n;

我将其设置为无符号,因为无符号整数更适合按位运算符。文字 1UL 的类型是 unsigned long。我发现使用后缀比强制转换更好,因为它更短并且是文字本身的一部分,而不是使用错误类型的文字并强制转换它。

许多人似乎期望这样的表达:

unsigned long long veryBig = 1 << 35; /* BAD CODE */

右侧应该以某种方式神奇地适应左侧的“需求”,从而成为 unsigned long long 类型(我只是假设它至少有 35 位,这当然不可移植,但很简洁)。这种情况不会发生,C 不会那样工作。对表达式进行求值,然后将其转换(如果需要)为左侧的类型以使赋值生效。

关于C 按位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28833933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com