相关疑难解决方法(0)

为什么在C和C++中算术运算之前必须将short转换为int?

从我从得到的回答这个问题,看来C++继承了这一要求,对于转换shortint从C.执行算术运算时,我可以挑你的大脑,以为什么这是用C首先介绍?为什么不做这些操作short呢?

例如(取自评论中的dyp建议):

short s = 1, t = 2 ;
auto  x = s + t ;
Run Code Online (Sandbox Code Playgroud)

x将具有int类型.

c c++ int short integer-promotion

70
推荐指数
4
解决办法
8650
查看次数

按位运算导致意外的可变大小

语境

我们正在移植最初使用 8 位 C 编译器为 PIC 微控制器编译的 C 代码。用于防止无符号全局变量(例如,错误计数器)回滚回零的常用习惯用法如下:

if(~counter) counter++;
Run Code Online (Sandbox Code Playgroud)

这里的按位运算符将所有位取反,并且该语句仅在counter小于最大值时才为真。重要的是,无论大小如何,这都有效。

问题

我们现在的目标是使用 GCC 的 32 位 ARM 处理器。我们注意到相同的代码会产生不同的结果。据我们所知,按位补码操作返回的值与我们预期的大小不同。为了重现这一点,我们在 GCC 中编译:

uint8_t i = 0;
int sz;

sz = sizeof(i);
printf("Size of variable: %d\n", sz); // Size of variable: 1

sz = sizeof(~i);
printf("Size of result: %d\n", sz); // Size of result: 4
Run Code Online (Sandbox Code Playgroud)

在第一行输出中,我们得到了我们所期望的:i是 1 个字节。然而,按位补码i实际上是四个字节,这会导致问题,因为现在与此比较不会给出预期的结果。例如,如果在做 (wherei是一个正确初始化的uint8_t):

if(~i) i++;
Run Code Online (Sandbox Code Playgroud)

我们会看到 i“环绕”从 0xFF 回到 0x00。与以前的编译器和 8 …

c microcontroller sizeof bitwise-operators

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