整型和有符号整型声明的区别

19

我正在阅读一些关于嵌入式编程的教程,其中一个教程说intsigned int是不同的,但没有解释它们的区别。

我明白为什么unsigned intint不同,但intsigned int不同是新的知识。


2
这对我来说也是新的。所以,教程在网上吗?如果是的话,链接将不胜感激。 - Shawn Chin
2个回答

28

这只是出于历史原因。今天,无论何时声明int,您都会得到一个signed int。即使是在今天的编译器中,您可能看到唯一有区别的地方是charsigned char,它们根据规范不同(并且在分配文字字符串时显着),但对于int则没有区别。


char和signed char有什么区别?你能举个例子吗? - Anon
2
@Anon - 问题是,默认情况下charsigned还是unsigned是未定义的。标准对此没有任何规定。 - Kiril Kirov
@Anon char和signed char的区别也是历史遗留问题,早期的架构可以将它们定义为任意一种类型,实际上,有些架构只使用了7位。 - Bernd Elkemann
7
“char”类型是有符号还是无符号的,这取决于具体实现。无论哪种情况,它仍然是与“signed char”和“unsigned char”不同的类型,正如eznme所说。因此,标准确实对此有规定,即要求实现文档记录其是否为有符号类型 :-) - Steve Jessop
为了参考,C99标准在第6.2.5节第15段描述了char的这种特殊性。C99标准第6.2.5节第4段提供了“普通”int有符号的保证。 - Vilhelm Gray
1
"C99 6.7.2.5 每个逗号分隔的集合指定相同的类型,**_但对于位域而言_,实现定义了指定符int是指定为signed int还是unsigned int相同类型。**" 我理解这意味着,如果您有一个int类型的位域,则它可以根据实现作为无符号或有符号来处理。因此,在使用位域时,最好明确指定它是有符号还是无符号。您可能认为char、short、long等位域也是如此。对于位域最安全的做法是明确指定。 - jschultz410

5
据我所知,这种差异仅存在于char数据类型中。其中,char a;可以根据编译器选项变为signed char a;unsigned char a;。正如这篇文章所说。(--signed_chars) 对于int数据类型,intsigned int之间没有区别。

+1,接受 Eznme 的答案,因为他/她回复得更早,而且与您的答案相同。 - Anon
1
“char”类型永远不会与“unsigned char”或“signed char”类型相同,即使它具有其中一个的相同范围和表示。 - Steve Jessop
@SteveJessop,你能否详细解释一下或者给我指点一些相关阅读材料? - CCoder
1
@grhegde:C99标准可以在http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf上找到。第6.2.5节定义了内置类型,该节的第14段说:“即使实现定义两种或更多基本类型具有相同的表示形式,它们仍然是不同的类型”。 C89和C11类似。 - Steve Jessop

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