[英]C convert from int to char
我有一个简单的代码
char t =(char)(3000);
那么t的值是-72。 十六进制值3000是0xBB8。 我不明白为什么t的值是-72。
谢谢你的回答。
关于Mac,我不知道。 所以我的结果是-72。 据我所知,MAC正在使用Big Endian,它会影响结果吗? 我没有任何MAC计算机进行测试,所以我想知道MAC人员。
十六进制值3000是0xBB8。
因此char的十六进制值(顺便说一下,似乎在编译器上签名)是0xB8。
如果它是无符号的,则0xB8将为184.但是由于它已经签名,其实际值减少了256,即-72。
如果你想知道为什么会这样,请阅读两个补码表示法。
char
是8位(只能表示0-255范围)。 试图将3000投射到一个char
是...... 不可能 不可能,至少是你想要的。
发生这种情况是因为3000的值太大而导致溢出。 Char 通常从-128到127签名,或0到255无符号,但它可以根据实现而改变。
char
是具有一定范围的可表示值的整数类型。 int
也是具有一定范围的可表示值的整数类型。 通常, int
范围比char
范围宽得多。 当你试图挤进一个char
的int
是不适合的范围值char
,该值将不“适合”的,当然。 实际结果是实现定义的。
在您的情况下, 3000
是一个int
值,它不适合您实现的char
范围。 所以,结果你不会得到3000
。 如果你真的想知道为什么它特意出现-72
请参阅实现附带的文档。
char(通常)只有8位,所以你不能存储大到3000的值(这至少需要 11 12位)。 因此,如果你想在一个字节中存储3000,它将只是换行。
由于3000是0xBBA,它需要两个字节,一个0x0B,一个是0xBA。 如果您尝试将其存储在单个字节中,您将只获得其中一个(0xBA)。 由于一个字节(通常)是签名的,即-72。
如指定的那样,16位十六进制值3000是0x0BB8
。 虽然具体实现 ,但是根据您发布的结果,这可能会以8位对的形式存储在内存中,如B8 0B
(某些架构会将其存储为0B B8
。这称为字节序 。)
另一方面, char可能不是16位类型。 同样,这是特定于实现的 ,但是根据您发布的结果,它看起来是8位,这并不罕见。
因此,当您的程序为您的值分配了8位内存时,您将在该内存中存储两倍的信息。 当程序稍后检索此值时,它将仅拉出第一个存储的八位字节,在本例中为B8
。 0B
将被忽略,如果它最终覆盖重要的东西,可能会在以后引起问题。 这称为缓冲区溢出 ,这非常糟糕。
假设两个补码 (技术上特定于实现 ,但是合理的假设), B8
的十六进制值转换为-72
或184
十进制,取决于您是处理有符号还是无符号类型。 由于您未指定任何一个,因此您的编译器将使用它的默认值。 再一次,这是特定于实现的 ,并且看起来您的编译器使用signed char 。
因此,你得到-72
。 但是不要指望在任何其他系统上获得相同的结果。
char
用于保存单个字符,并且您尝试将4位int
存储在一个中。 也许您打算使用字符数组或字符串(在本例中为char t[4]
)。
要将int转换为字符串(未经测试):
#include <stdlib.h>
int main() {
int num = 3000;
char numString[4];
itoa(num, buf, 10);
}
哦,我明白了,它是溢出的 ,就像char只是从-256到256或类似的东西我不确定,就像你有一个var类型的最大限制是256并且你加1,它比它变成-256等等
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.