在C语言中,省略符号是否会自动默认为有符号变量?

3

在 IT 技术中,long 是否等同于 signed long(或者说是 intchar 等)?这个规范是否有保证,或者说是否有些版本或编译器可能会因为我把它作为理所当然而崩溃?


不,不使用位域。 - chux - Reinstate Monica
1
@chux 智慧的尤达大师,如果您能用简单易懂的语言与我交流,我将不胜感激。我的年轻学徒头脑无法理解您的伟大智慧。 - AlanSTACK
位域是一种特殊情况,它允许您指定在变量中存储的值的范围需要多少位。对此的最佳回答是正确的,但如果您正在使用位域(您可以通过谷歌搜索了解其具体语法),则似乎存在与有符号/无符号解释相关的实现定义行为。 - Stephano
"枚举类型的有无符号也由具体实现决定" - phuclv
尚未提及,如果没有明确指定,位域可以是有符号的或无符号的。 - M.M
@AlanSTACK re 尤达也必须睡觉。 - chux - Reinstate Monica
3个回答

6
除了char之外,所有类型都可以使用您列出的方法。 char在实现中是有符号或无符号的。此外,charsigned charunsigned char完全不同,尽管它将具有与其中一个完全相同的属性。
您可能认为我在胡说八道,但这就是C标准:
6.2.5类型-p15
引用如下:

字符类型包括三种类型:charsigned charunsigned char。实现应定义char具有与signed charunsigned char相同的范围、表示和行为。


字符默认是有符号还是无符号的? - phuclv

3

是的,以下两个变量定义是相同的:

long x = 9;
signed long x = 9;

signed 关键字在这里是不必要的,因为变量默认情况下是有符号的,除了char。如果需要使用 unsigned,则需要显式使用 unsigned 关键字。


1
省略 signed 在 C 中是否自动默认为有符号变量?
通常是,但并非总是如此。以下是例外情况
  1. char 是与 unsigned charsigned char 不同的类型。 char 的范围与 unsigned charsigned char 相同。

  2. wchar_tchar 类似。

  3. 位域。

关于位域的关键引用表明,int 位域可以是有符号或无符号的。这是实现定义的行为。 如果允许使用 longunsigned longunsigned long,则会产生实现定义的行为。另请参阅

位域必须具有限定或未限定版本的 _Boolsigned intunsigned int 或其他实现定义类型。C11dr §6.7.2.1 5

位域被解释为具有指定位数的带符号或无符号整数类型。125 §6.7.2.1 10

125 如上所述,如果使用的实际类型说明符是 int 或 ...,则位域是有符号还是无符号是实现定义的。

  1. 可能存在其他例外情况 - 但我不知道它们。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接