繁体   English   中英

C从int转换为char

[英]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范围宽得多。 当你试图挤进一个charint是不适合的范围值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的十六进制值转换为-72184十进制,取决于您是处理有符号还是无符号类型。 由于您未指定任何一个,因此您的编译器将使用它的默认值。 再一次,这是特定于实现的 ,并且看起来您的编译器使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM