困惑于 char a='abc';行为C编程

Confused at char a='abc'; behavior C programming

32位系统的字长是4字节。 所以 char a='bcd';已验证。一个 32 位整数可以容纳 4 个 ASCII 字符。

char a='bcd';
//output is d for this line
printf("%c\n",a); 

//output is 'z' when i use *(&a-1) and '�'(is -67 when manipulated)
printf("%c\n",*(&a-1)); 

现在我只想知道&a-1 (this is not 'b')会点什么?它是最后的内存地址吗? 还有一件事,字符被打包到 int.

中的顺序是什么
------------------------------------------------------------------------------
| bits  : _ _ _ _ _ _ _ 8 _ _ _ _ _ _ _ 16 _ _ _ _ _ _ _ 24 _ _ _ _ _ _ _ 32 |
| order : ? ? ? ? ? ? ? 8 ? ? ? ? ? ? ? 16 ? ? ? ? ? ? ? 24 ? ? ? ? ? ? ? 32 |
------------------------------------------------------------------------------

"so char a='bcd'; is valid." 不,它不是,至少不是你期望的那种感觉(是的,'bcd' 是一个多字节字符常量,但是 是否如您所期望的那样存储多个字符,而是一些实现定义的数字)。

一个char包含一个单个字符,它总是一个字节长。写作 char a 给你一个字节来玩。您无法 通过a 访问之前和之后的字节。编译器还 not 需要在 char 周围添加任何填充,如果它不想的话。由于文字 'bcd' 具有(至少在我的系统上)不适合 char 的值(在我的系统上为 6447972),您最终得到一个字节 char具有实现定义的值。即使 a 周围有填充字节,您也不能假设它们会被写入。

printf("%c\n",*(&a-1));

调用未定义的行为,因为您不拥有该内存。这与任何类型的 "word size".

无关

如果要存储字符序列,请使用

const char *str = "Some text";

(或

char str[] = "Some text";

如果你想修改序列)在 C 或

std::string str = "Some text";

在 C++ 中。


好的,你的编辑让你更清楚你在说什么。引用您发布的内容:

4 ASCII characters can fit in a 32 bit integer

但是 char 不是 32 位整数。它通常是一个 8 位整数。您发布的文字是在谈论类似

的内容
int32_t a = 'bcd';

(或可能 uint32_t a)。现在 a 实际上是 32 位长,可以容纳 32 位信息。但是正如您引用的文字已经说过的那样,这很少有用,因为这种分配的结果完全取决于实现。