Gcc:强制编译器默认使用无符号字符 由于C++中的代码< char < /c>的性质是编译器依赖的,当未签名< /COD>限定符不存在时,是否有一个参数可以传递给GCC,它将 >强制> > char < /C> > S被编译为未签名< /C> > < /p> < p>您正在寻找的标志是“代码> -fc签名char < /代码> .

Gcc:强制编译器默认使用无符号字符 由于C++中的代码< char < /c>的性质是编译器依赖的,当未签名< /COD>限定符不存在时,是否有一个参数可以传递给GCC,它将 >强制> > char < /C> > S被编译为未签名< /C> > < /p> < p>您正在寻找的标志是“代码> -fc签名char < /代码> .,c++,gcc,char,unsigned,C++,Gcc,Char,Unsigned,发件人: -funsigned char 让类型char不带符号,就像unsigned char一样 每种机器都有一个默认的char属性。默认情况下,它要么像无符号字符,要么像有符号字符 理想情况下,便携式程序应始终使用有符号字符或无符号字符,这取决于对象的有符号性。但许多程序都是使用纯字符编写的,并且期望它被签名,或者期望它不被签名,这取决于它们编写的机器。此选项及其相反选项允许您使这样的程序以相反的默认值工作 类型char总是与signed char或unsigned char中的每一个不同

发件人:

-funsigned char

让类型
char
不带符号,就像
unsigned char
一样

每种机器都有一个默认的
char
属性。默认情况下,它要么像
无符号字符
,要么像
有符号字符

理想情况下,便携式程序应始终使用
有符号字符
无符号字符
,这取决于对象的有符号性。但许多程序都是使用纯字符编写的,并且期望它被签名,或者期望它不被签名,这取决于它们编写的机器。此选项及其相反选项允许您使这样的程序以相反的默认值工作

类型
char
总是与
signed char
unsigned char
中的每一个不同的类型,即使其行为总是与这两个类型中的一个相似


-fsigned char

让类型
char
签名,如
signed char

请注意,这相当于
-fno unsigned char
,它是
-funsigned char
的否定形式。同样,选项
-fno signed char
相当于
-funsigned char


这只影响字符

您可以使用
-funsigned char
进行签名,或者
-fsigned char
进行签名。

您可以使用选项:
-funsigned char


正如其他答案所说,gcc的
-funsigned char
选项强制普通
char
不签名

但这可能不是解决你问题的最好办法。您需要无符号字符,但通过使用特定于编译器的选项,您可以在build命令(Makefile、build脚本或仅键入用于编译代码的命令)中对该信息进行编码。如果程序的语义依赖于具有无符号字符,那么最好将该信息记录在源代码中。它更清晰,并且减少了有人错误地构建您的程序的机会


如果需要无符号字符,请使用
无符号字符
。如果需要签名字符,请使用
signed char
。如果您只需要字符,并且您确信您的程序的行为不取决于它们是有符号的还是无符号的(例如,如果所有存储的值都在0..127范围内),请使用
char

没有足够的信誉来评论@Keith的答案

我看到使用
-funsigned char
-fsigned char
的主要原因是您需要以下代码

  printf("%d\n",'\x80');
显示
-128
128


关于不依赖特定编译设置的评论是有效的,但在这里它有点简化了现实。主要的问题是,出于效率考虑,C将语言的某些部分留给了实现,通常您希望对该实现进行调优,以使其最适合您的应用程序。在我看来,一个专业的开发人员应该检查所有的编译器标志,并根据自己的需要选择最好的。如果您依赖于某些特定的设置,那么单元测试当然会覆盖这种情况,或者断言它。如果你移植了一个应用程序,你会查看原始端口的编译设置。

我通过谷歌搜索
gcc force unsigned char
然后阅读出现的gcc文档,在十秒钟内发现了这一点。是什么阻止了你进行这项研究?@LRO,因为你显然比通过谷歌搜索要快得多…;)使用
无符号字符
可能比使用普通的
字符
更好。您的程序可能会链接到未使用
-funsigned char
编译的代码。如果您依赖于无符号字节,那么在代码中表达它比在编译器选项中更安全。@Keith——这是我在这里读到的最疯狂的评论。纯文本ascii文件不知道字节是有符号的还是无符号的,更不用说内存了。默认情况下,某些平台将char设置为未签名。char数据类型规范一开始就没有特别强调签名性。@B.Nadolson:如果你认为我的评论最疯狂,你一定没有读过很多评论。问题不是关于ASCII文本文件,而是关于类型
char
。类型
char
对于其符号性非常特殊。在某些实现中,它是经过特别签名的;在其他人身上,它特别没有签名。如果签名很重要,则应使用
有符号字符
无符号字符
;这就是它们存在的原因。你能确认这个标志对
wchar\u t
的签名没有影响吗?@Antonio:不知道,对不起。@Antonio:“TMO”代表什么?我明白了。我不熟悉那种结构。对我来说也不合乎语法。这意味着什么?在谷歌搜索之后,做s/to/in/对你来说可能更清楚。事实证明我已经用了很多年了,但确实是不正确的。谢谢你指出!