3

我目前正在处理从第三方承包商购买的代码。一个结构有一个无符号字符字段,而他们将该字段传递给的函数需要一个有符号字符。编译器不喜欢这样,因为它认为它们是不匹配的类型。然而,它显然是为那个承包商编译的。一些谷歌搜索告诉我“[i]t 是实现定义的 char 对象是否可以保存负值”。承包商的编译器可以基本上忽略有符号/无符号类型并同样对待它们吗?或者是否有一个编译器标志将它们视为相同?

C 不是我最强的语言——只要看看我的用户页面上的标签——所以任何帮助都将不胜感激。

4

3 回答 3

3

实际上char和是三种不同的类型signed charunsigned char根据标准(ISO/IEC 9899:1990):

6.1.2.5 类型

...

charsigned charunsigned char这三种类型统称为字符类型

(例如在 C++ 中,如果你有一个 char 参数,你必须(或至少应该)用它们的三个变体编写覆盖函数)

普通字符可能会被编译器处理为有符号或无符号,但标准说(也在 6.1.2.5 中):

声明为char类型的对象大到足以存储基本执行字符集的任何成员。如果 5.2.1 中所需源字符集的成员存储在 char对象中,则保证其值为正数。如果其他数量存储在char对象中,则行为是实现定义的:这些值被视为有符号或非负整数。

声明为 signed char 类型的对象占用与“普通”字符对象相同的存储量。

5.2.1中提到的字符有AZ、az、0-9、空格、制表符、换行符以及以下29个图形字符:

! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~ 

回答

我解释的所有这些基本上意味着值小于 128 的 ascii 字符被保证为正数。因此,如果存储的值始终小于 128,它应该是安全的(从价值保存的角度来看),尽管不是很好的做法。

于 2009-09-01T13:29:48.947 回答
1

这取决于编译器。例如,在 VC++ 中,如果该选项指示默认使用 unsigned char,则定义了一个编译器选项和一个相应的 _CHAR_UNSIGNED 宏。

于 2009-09-01T13:10:09.513 回答
0

我认为您在谈论类型字段signed charand unsigned char,因此它们显然是错误的。如果其中一个是简单的char,它可能与承包商正在使用的任何编译器匹配(IIRC,它是实现定义的,无论charsigned还是unsigned),但在你的编译器中不匹配。在这种情况下,您可能可以使用命令行选项或其他东西来更改您的选项。

或者,承包商可能正在使用编译器或编译器选项,允许他在编译时忽略错误或警告。你知道他有什么样的编译环境吗?

无论如何,这不是好的 C。如果其中一种类型是 just char,它依赖于实现定义的行为,因此不可移植。如果不是,那就大错特错了。我会和承包商讨论这个问题。

于 2009-09-01T13:32:02.327 回答