【发布时间】:2017-12-22 03:45:31
【问题描述】:
我创建了一个 unsigned int 和 unsigned char。然后我分配 -10 值,char 保持无符号并给我一个值 246,但 unsigned int 采用 -10 值。
#include <stdio.h>
int main ()
{
unsigned char a;
unsigned int b;
a=-10;
b=-10;
printf("%d\t%d\n", a,b);
}
编译和执行我有这个:
246 -10
我不知道为什么 unsigned int 仍然签名,以及为什么 char 是 unsigned。
阅读《The C programming language 2nd edition》一书,我可以看到 char 在默认情况下可以是无符号的,具体取决于机器。
(我将 NetBSD 作为操作系统运行。)
为什么当我声明为 unsigned int 时 int 是有符号的,为什么 char 的值为 246?
这是编译器还是系统操作“功能”?
【问题讨论】:
-
因为
%d用于有符号整数。 -
%d告诉函数将该参数“解释”为有符号整数,无论其声明如何(只要它通过编译器的语义检查) -
使用
%d到printf的unsigned int值大于INT_MAX是非法的。行为未定义,输出无意义。就未定义的行为问“为什么”问题是没有意义的。 -
@AnT - 将
%d格式用于unsigned int并非“非法”。它给出了未定义的行为。有区别。 -
@Peter:“英语词典”与此关系不大。语言规范明确允许编译器拒绝编译包含未定义行为的代码。这意味着在一般情况下,这可能与常规语法错误一样“非法”。或者它可能不是......
标签: c