相关疑难解决方法(0)

无符号字符c = 255是"11111111"还是不是?

这是我的问题代码:

#include "stdio.h"

int main()
{
        char a = -1;
        unsigned char b = 255;
        unsigned char c = 0;
        if((~a) ==  c)
                printf("OK 1");
        else
                printf("bad 1");
        printf("\n");
        if((~b) ==  c)
                printf("OK 2");
        else
                printf("bad 2");
        printf("\n");
}
Run Code Online (Sandbox Code Playgroud)

我希望这打印:

OK 1

OK 2
Run Code Online (Sandbox Code Playgroud)

但是,我得到了1和坏2!

如果unsigned char b是255(11111111),那么~b应该是00000000.为什么它不等于c?

我使用gcc在Linux SUSE上工作.

c binary char

9
推荐指数
1
解决办法
3874
查看次数

采用int参数是否需要%c fprintf说明符

在C99标准的第7.19.6.1节第8 节中:

c如果不存在l长度修饰符,则将int参数转换为a unsigned char,并写入生成的字符.

在C99标准的第7.19.6.1节第9段中:

如果任何参数不是相应转换规范的正确类型,则行为未定义.

  • fprintf函数是否需要int参数?

例如,将unsigned int结果传递给未定义的行为:

unsigned int foo = 42;

fprintf(fp, "%c\n", foo); /* undefined behavior? */
Run Code Online (Sandbox Code Playgroud)

这让我很担心,因为实施可能被定义char为具有与unsigned char(第6.2.5段第15段)相同的行为.

对于这些情况,整数提升可能要求在某些实现中char提升unsigned int.因此,将以下代码留给那些实现的未定义行为风险:

char bar = 'B';

fprintf(fp, "%c\n", bar); /* possible undefined behavior? */
Run Code Online (Sandbox Code Playgroud)
  • int变量和字面int常量的值传递给唯一安全的方法fprintf%c符?

c printf c99 variadic-functions language-lawyer

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

取消引用这个指针给了我-46,但我不知道为什么

这是我运行的程序:

#include <stdio.h>

int main(void)
{
    int y = 1234;
    char *p = &y;
    int *j = &y;
    printf("%d %d\n", *p, *j);
}
Run Code Online (Sandbox Code Playgroud)

我对输出有点困惑.我所看到的是:

-46 1234
Run Code Online (Sandbox Code Playgroud)

我把这个程序写成了一个实验,不知道它会输出什么.我期待可能有一个字节y.

这里发生了什么"幕后"?解除引用如何p给我-46

正如其他人指出的那样,我必须进行明确的施法才能导致UB.我没有改变这一行char *p = &y;,char *p = (char *)&y;所以我没有使下面的答案无效.

此程序不会导致此处指出的任何UB行为.

c pointers casting dereference

-3
推荐指数
2
解决办法
1243
查看次数