在"C的完整参考"一书中,提到char默认情况下是无符号的.
但我试图用GCC和Visual Studio验证这一点.它默认签名.
哪一个是正确的?
我最近读过这篇文章
unsigned char x=1;
printf("%u",x);
Run Code Online (Sandbox Code Playgroud)
由于格式说明符%u,因此调用未定义的行为,printf需要unsigned int.但我还是想了解这个例子中发生了什么.
我认为整数推广规则适用于表达式printf("%u",x)
和由...表示的值x.
A.6.1整体推广
无论是否有符号,都可以使用字符,短整数或整数位字段,或者枚举类型的对象,可以在任何可以使用整数的表达式中使用.如果int可以表示原始类型的所有值,则该值将转换为int; 否则该值将转换为unsigned int.这个过程称为整体推广.
"可以使用"是什么意思?这是否意味着"在句法上是正确的"还是"定义的行为"?
在这个例子中如何推广x?我已经读过它被提升为一个int,但是如果printf("%u", (int x))仍然是未定义的行为那么我真的不明白为什么......
c printf variadic-functions undefined-behavior integer-promotion
运行以下程序显示-4,而预期252:
unsigned char a=3;
printf ("%d", ~a);
Run Code Online (Sandbox Code Playgroud)
为什么这段代码不显示252?
我还根据提出的答案测试了下面的内容:
printf ("%u", ~a);
Run Code Online (Sandbox Code Playgroud)
显示:4294967292
printf ("%hu", ~a);
Run Code Online (Sandbox Code Playgroud)
显示:65532
为什么~a不返回unsigned char,因为一个是一个unsigned char?
我的问题不是我应该怎么做才能显示252?我的问题是为什么没有显示252?
在C中加载二进制文件时,我得到了意想不到的结果.
FILE *bin = NULL;
unsigned long file_length = 0;
bin = fopen("vs.bin", "rb");
fseek(bin, 0, SEEK_END);
file_length = ftell(bin);
fseek(bin, 0, SEEK_SET);
char *buffer = (char *)malloc(file_length);
fread(buffer, 1, file_length, bin);
for(unsigned int i = 0; i < file_length; i++) {
printf("%02x ", buffer[i]);
}
printf("\n");
Run Code Online (Sandbox Code Playgroud)
我在前八个输出值中看到的是:
56 53 48 05 ffffffa4 ffffff8b ffffffef 49
Run Code Online (Sandbox Code Playgroud)
但是当我在十六进制编辑器中打开二进制文件时,我看到的是:
56 53 48 05 A4 8B EF 49
Run Code Online (Sandbox Code Playgroud)
什么会导致这种情况发生?整个过程中发生了更多这种情况,但我认为只分享第一部分就足以说明问题了.
谢谢阅读.
输出是32位2的128补码,即4294967168.如何?
#include <stdio.h>
int main()
{
char a;
a=128;
if(a==-128)
{
printf("%u\n",a);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)