gpt4 book ai didi

c - 使用 gcc 时是什么导致 char 被签名或未签名?

转载 作者:太空狗 更新时间:2023-10-29 16:18:46 25 4
gpt4 key购买 nike

如果 C(使用 gcc)中的 char 有符号或无符号,是什么原因造成的?我知道该标准并没有规定一个优于另一个,我可以从 limits.h 检查 CHAR_MINCHAR_MAX 但我想知道是什么触发了另一个使用 gcc 时

如果我从 libgcc-6 读取 limits.h,我会看到有一个宏 __CHAR_UNSIGNED__ 定义了一个“默认”char signed 或 unsigned 但我不确定这是否由编译器设置在(他的)构建时间。

我试图列出 GCC 预定义的 makros

$ 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

但无法找到 __CHAR_UNSIGNED__

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

台式电脑:

  • Debian GNU/Linux 9.1(扩展版)
  • gcc 版本 6.3.0 20170516 (Debian 6.3.0-18)
  • 英特尔(R) 酷睿(TM) i3-4150
  • libgcc-6-dev: 6.3.0-18
  • char 已签名

树莓派3:

  • Raspbian GNU/Linux 9.1(扩展版)
  • gcc 版本 6.3.0 20170516 (Raspbian 6.3.0-18+rpi1)
  • ARMv7 处理器版本 4 (v7l)
  • libgcc-6-dev: 6.3.0-18+rpi
  • char 是无符号的

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

最佳答案

根据C11标准(阅读 n1570 ),char可以是signedunsigned (所以你实际上有两种 C 风格)。具体是什么是特定于实现的。

一些 processorsinstruction set architecturesapplication binary interfaces赞一个signed字符(字节)类型(例如因为它很好地映射到一些 machine code 指令),其他喜欢 unsigned一个。

gcc甚至有一些-fsigned-char-funsigned-char option你几乎不应该使用它(因为改变它会破坏 calling conventions 和 ABIs 中的一些极端情况)除非你重新编译所有东西,包括你的 C standard library .

你可以使用 feature_test_macros(7)<endian.h> (参见 endian(3) )或 autoconf在 Linux 上检测您的系统有什么。

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

顺便说一句 gcc -dM -E -x c /dev/null还给出了 __BYTE_ORDER__等等,如果你想要一个无符号的 8 位字节,你应该使用 <stdint.h>及其 uint8_t (更便携,更易读)。和标limits.h定义 CHAR_MINSCHAR_MINCHAR_MAXSCHAR_MAX (您可以比较它们的相等性以检测 signed char 的实现),等等...

顺便说一句,你应该关心character encoding , 但今天大多数系统使用 UTF-8 everywhere .像 libunistring 这样的图书馆有帮助。另见 this请记住,实际上是一个 UnicodeUTF-8 中编码的字符可以跨越几个字节(即 char -s)。

关于c - 使用 gcc 时是什么导致 char 被签名或未签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46463064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com