当前位置: 首页 > 知识库问答 >
问题:

使用gcc时,是什么导致char被签名或取消签名?

曹成双
2023-03-14

如果一个char在C(使用gcc)是有符号或无符号的原因是什么?我知道标准没有规定一个在另一个之上,我可以检查CHAR_MINCHAR_MAX从限制. h,但我想知道什么触发一个在另一个使用gcc时

如果我读极限。从libgcc-6中,我看到有一个宏CHAR UNSIGNED,它定义了一个“默认”字符signed或UNSIGNED,但我不确定这是否是编译器在编译时设置的。

我试着用

$ gcc -dM -E -x c /dev/null | grep -i CHAR
#define __UINT_LEAST8_TYPE__ unsigned char
#define __CHAR_BIT__ 8
#define __WCHAR_MAX__ 0x7fffffff
#define __GCC_ATOMIC_CHAR_LOCK_FREE 2
#define __GCC_ATOMIC_CHAR32_T_LOCK_FREE 2
#define __SCHAR_MAX__ 0x7f
#define __WCHAR_MIN__ (-__WCHAR_MAX__ - 1)
#define __UINT8_TYPE__ unsigned char
#define __INT8_TYPE__ signed char
#define __GCC_ATOMIC_WCHAR_T_LOCK_FREE 2
#define __CHAR16_TYPE__ short unsigned int
#define __INT_LEAST8_TYPE__ signed char
#define __WCHAR_TYPE__ int
#define __GCC_ATOMIC_CHAR16_T_LOCK_FREE 2
#define __SIZEOF_WCHAR_T__ 4
#define __INT_FAST8_TYPE__ signed char
#define __CHAR32_TYPE__ unsigned int
#define __UINT_FAST8_TYPE__ unsigned char

但无法找到\uu CHAR\u UNSIGNED\uu

背景:我在两台不同的机器上编译了一些代码:

台式电脑:

  • Debian GNU/Linux 9.1(stretch)
  • gcc版本6.3.0 20170516(Debian 6.3.0-18)
  • Intel(R)Core(TM)i3-4150
  • libgcc-6-dev:6.3.0-18
  • 字符已签名

覆盆子Pi3:

  • Raspbian GNU/Linux 9.1(stretch)

所以唯一明显的区别是CPU架构...

共有3个答案

景志
2023-03-14

字符类型为有符号或无符号,具体取决于平台和编译器。

根据此参考链接:

C和C标准允许字符类型char有符号或无符号,具体取决于平台和编译器。

大多数系统,包括x86 GNU/Linux和Microsoft Windows,都使用签名字符,

但基于PowerPC和ARM处理器的处理器通常使用无符号字符。(29)

当在具有不同字符类型默认值的平台之间移植程序时,这可能会导致意外的结果。

GCC提供选项fsigned char和funsigned char来设置字符的默认类型。

章振
2023-03-14

默认值取决于平台和本机代码集。例如,使用EBCDIC的机器(通常是大型机)必须使用无符号字符(或具有字符位)

您可以使用-fsined-char-funsined-char选项控制GCC使用哪个符号。这是否是一个好主意是一个单独的讨论。

明正德
2023-03-14

根据C11标准(阅读n1570),char可以是有符号的无符号的(所以你实际上有两种C风格)。它到底是什么是特定于实现的。

一些处理器和指令集架构或应用程序二进制接口支持有符号的字符(字节)类型(例如,因为它很好地映射到某些机器代码指令),另一些则支持无符号的。

gcc甚至有一些fsigned char或funsigned char选项,除非您重新编译所有内容,包括您的C标准库,否则您几乎永远都不应该使用这些选项(因为更改它会打破调用约定和ABI的一些转折点)。

您可以使用feature_test_macros(7)和

在大多数情况下,您应该编写可移植的C代码,它不依赖于这些东西。你可以找到跨平台库(例如glib)来帮助你。

顺便说一句,gcc-dM-E-x c/dev/null也给出了字节顺序等,如果你想要一个无符号的8位字节,你应该使用

顺便说一句,你应该关心字符编码,但今天大多数系统在任何地方都使用UTF-8。像libunistring这样的库很有用。另请参阅这一点,并记住,实际上用UTF-8编码的Unicode字符可以跨越几个字节(即字符)。

 类似资料:
  • 正如我从https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html了解到的,使用jarsigner签署jar文件的过程如下: > 清单文件用每个文件的哈希列表更新: 名称: com/qark/util/files/diff/用户界面/main/DiffMergeFrame.classSHA-256-Digest: GZgPXG

  • 本文向大家介绍什么是盲目签名?相关面试题,主要包含被问及什么是盲目签名?时的应答技巧和注意事项,需要的朋友参考一下 回答:** 盲签名是密码术中数字签名的一种形式,其中消息的内容在签名或考虑之前是盲的。它主要用于作者和签名方不同的隐私相关协议中。这是一种经过验证的方法。 例如:数字现金计划

  • 问题内容: 我正在尝试检查字符串在不同位置处的连字符(对于电话号码,因为输入有所不同),但是我一直收到错误消息 不能取消引用char 码: 问题答案: 如果您使用类似的方法,它将起作用: 问题是返回a 而不是a 。该方法只能用于对象。Char是没有方法的原始数据类型。在char上,您应该使用或运算符。

  • 正在签署的摘要到底是什么?如果签名嵌入到提交对象中,那么它很难是提交哈希本身-那么它是树哈希吗?还是别的什么?这是否意味着提交消息没有签名并且可能被篡改? 注意:我在这里使用一个用--object-type sha256初始化的git存储库来使用基于SHA-256的哈希值(默认情况下git使用SHA-1),但我的问题也适用于带有SHA-1哈希值的git存储库(以防gpg签名对SHA-1和SHA-2

  • 问题内容: 我第一次在方法签名中看到它。 我试图访问一个.class文件。它具有如下定义的方法 那个GraphData就是带有getter和setter的POJO。为什么显示.class文件而不是显示? 问题答案: 它是 varargs ,只能在参数列表中最后使用。最后一个参数可以容纳多个对象。 查看“ a”和“ b”如何转换为数组。

  • 什么是正确的方式来指定回调时,做一个POST为"/1.1/列表/create.json"? 以下是Twitter API文档:https://dev.twitter.com/rest/reference/post/lists/create MyTwitterApiClient