如果我想把一个整数存储到一个char类型的变量中,那么存储整数的哪个字节呢?
If I want to store an integer into a char type variable, which byte of the integer will be stored?
int a = 0x11223344;
char b = (char)a;
我是编程和学习 C 的新手。为什么我在这里得到 b
的值是 D
?
If I want to store an integer into a char type variable, which byte of the integer will be stored?
C 标准没有完全定义。
在您尝试的特定情况下,可能发生的情况是 0x11223344
的低八位存储在 b
中,产生 4416 (6810) in b
,打印出“D”是因为你的系统使用ASCII字符编码,而68是“D”的ASCII码。
但是,您应该警惕这样的工作,因为它取决于几件事,并且可能会有变化。
首先,C 标准允许 char
有符号或无符号。它还允许 char
是八位或更大的任何宽度。在今天的大多数 C 实现中,它是八位。
其次,从int
到char
的转换取决于char
是有符号的还是无符号的,C标准可能没有完全定义。
如果 char
是无符号的,则转换定义为对模 M+1 进行换行,其中 M 是char
中可表示的最大值。实际上,这与获取值的低字节相同。如果无符号的char
有8位,它的M就是255,所以M+1就是256。
如果 char
有符号且值超出 char
类型的范围,则转换为 implementation-defined:它可能会陷入或产生 implementation-defined价值。您的 C 实现可能会将转换包装为有符号整数类型,类似于将转换包装为无符号类型的方式,但另一个合理的行为是将 out-of-range 值“钳制”到类型的限制,CHAR_MIN
和 CHAR_MAX
。例如,将 −8000 转换为 char
可以产生最小值 −128,而将 0x11223344
转换为 char
可以产生最大值 +127.
第三,C 标准不要求实现使用 ASCII。使用 ASCII 非常普遍。 (通常,字符编码不只是 ASCII,因为 ASCII 只涵盖从 0 到 127 的值。C 实现通常使用 ASCII 之外的一些扩展来表示 128 到 255 的值。)
int a = 0x11223344;
char b = (char)a;
我是编程和学习 C 的新手。为什么我在这里得到 b
的值是 D
?
If I want to store an integer into a char type variable, which byte of the integer will be stored?
C 标准没有完全定义。
在您尝试的特定情况下,可能发生的情况是 0x11223344
的低八位存储在 b
中,产生 4416 (6810) in b
,打印出“D”是因为你的系统使用ASCII字符编码,而68是“D”的ASCII码。
但是,您应该警惕这样的工作,因为它取决于几件事,并且可能会有变化。
首先,C 标准允许 char
有符号或无符号。它还允许 char
是八位或更大的任何宽度。在今天的大多数 C 实现中,它是八位。
其次,从int
到char
的转换取决于char
是有符号的还是无符号的,C标准可能没有完全定义。
如果 char
是无符号的,则转换定义为对模 M+1 进行换行,其中 M 是char
中可表示的最大值。实际上,这与获取值的低字节相同。如果无符号的char
有8位,它的M就是255,所以M+1就是256。
如果 char
有符号且值超出 char
类型的范围,则转换为 implementation-defined:它可能会陷入或产生 implementation-defined价值。您的 C 实现可能会将转换包装为有符号整数类型,类似于将转换包装为无符号类型的方式,但另一个合理的行为是将 out-of-range 值“钳制”到类型的限制,CHAR_MIN
和 CHAR_MAX
。例如,将 −8000 转换为 char
可以产生最小值 −128,而将 0x11223344
转换为 char
可以产生最大值 +127.
第三,C 标准不要求实现使用 ASCII。使用 ASCII 非常普遍。 (通常,字符编码不只是 ASCII,因为 ASCII 只涵盖从 0 到 127 的值。C 实现通常使用 ASCII 之外的一些扩展来表示 128 到 255 的值。)