困惑于 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 位信息。但是正如您引用的文字已经说过的那样,这很少有用,因为这种分配的结果完全取决于实现。
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 位信息。但是正如您引用的文字已经说过的那样,这很少有用,因为这种分配的结果完全取决于实现。