相关疑难解决方法(0)

为什么C字符文字而不是字符?

在C++中sizeof('a') == sizeof(char) == 1.这具有直观意义,因为它'a'是一个字符文字,并且sizeof(char) == 1由标准定义.

然而,在C中sizeof('a') == sizeof(int).也就是说,看起来C字符文字实际上是整数.有谁知道为什么?我可以找到很多关于这个C怪癖的提及,但没有解释为什么它存在.

c c++ sizeof char

101
推荐指数
7
解决办法
2万
查看次数

使用printf打印size_t的正确方法是什么?

Size_t被定义为一个unsigned整数,但它的大小取决于你是在32位还是64位机器上.什么是正确和便携的打印方式size_t

c c++

68
推荐指数
3
解决办法
5万
查看次数

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

语境

我们正在移植最初使用 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
查看次数

sizeof运算符返回4(char + short)

鉴于此代码段:

    #include <stdio.h>

    int main() {

        short i = 20;
        char c = 97;

        printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i));

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

为什么sizeof(c + i) == 4

c

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

在添加和计算时,sizeof如何适用于不同的数据类型?

#include <stdio.h>

int main()
{
    short int i = 20;
    char c = 97;
    printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这段代码的输出是

2, 1, 4
Run Code Online (Sandbox Code Playgroud)

根据我应该是

2, 1, 2
Run Code Online (Sandbox Code Playgroud)

因为char + short intshort int和大小的short int2.

c sizeof

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

标签 统计

c ×5

sizeof ×3

c++ ×2

bitwise-operators ×1

char ×1

microcontroller ×1