这是我的问题代码:
#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上工作.
在C99标准的第7.19.6.1节第8 节中:
c如果不存在l长度修饰符,则将int参数转换为aunsigned 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符?这是我运行的程序:
#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行为.