【发布时间】:2015-01-01 18:11:13
【问题描述】:
最近,我读到了一个关于 C 中三种不同类型 char/unsigned char/signed char 的问题。我现在遇到的问题不是我到目前为止遇到的问题(我的程序在所有经过测试的计算机上都能正常工作,并且只针对 little-endian(基本上所有使用 Windows/Linux 的现代台式机和服务器对吗?)。我经常重用一个 char我定义的数组将“字符串”(当然不是真正的字符串)作为临时变量。例如,我没有向堆栈添加另一个字符,而是重用了数组 [0] 之类的成员之一。但是,我基于此策略一个 char 总是会被签名的事实,直到我今天读到它实际上取决于实现。如果我现在有一个 char 并且我给它分配一个负值会发生什么?
char unknownsignedness = -1;
如果我写了
unsigned char A = -1;
我认为 C 风格的转换只会重新解释位,并且 A 表示为无符号类型的值会变得不同。我对这些 C 风格的演员表只是对位的重新解释是对的吗?我现在指的是有符号 无符号转换。
因此,如果实现将 char 设置为无符号,我的程序会停止按预期工作吗?取最后一个变量,如果我现在这样做的话
if (A == -1)
我现在将 unsigned char 与 signed char 值进行比较,所以这会简单地比较不关心符号的位还是会返回 false,因为显然 A 不能为 -1?我很困惑在这种情况下会发生什么。这也是我最关心的问题,因为我经常使用这样的字符。
【问题讨论】:
-
什么选角?任何地方都没有铸造。如果您想存储二进制(非字符)数据,请使用更好的 (IMO)
int8_t或uint8_t标准类型。 -
我的实现不支持 C99,我认为 int8_t 是针对那个版本的
-
如果我将一个有符号值分配给一个无符号值,会不会进行强制转换?还是只有在数据大小不匹配时才会进行强制转换?
-
有自动转换,而不是强制转换。铸造是当你写像
(unsigned char) -1 -
如果确实像上面的例子一样,我为无符号数据类型分配了一个负值,会发生什么?这些位是否被重新解释?还是这些位本身发生了变化?还有比较中会发生什么(我在问题中的最后一个例子)。
标签: c char signedness