首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C:使用8位字符表示完整的int

问C:使用8位字符表示完整的int
EN

Stack Overflow用户
提问于 2013-04-19 19:48:13
回答 4查看 1.1K关注 0票数 0

我正在尝试将char的8位转换为int的最低有效位。我知道从char到int的转换很容易通过

代码语言:javascript
复制
int var = (int) var2;

其中var2的类型为char (甚至不放置(int))。

但是我想知道,如果我写上面的代码,int的其余最高有效位(32-8=) 24位是随机的还是设置为0?

示例:假设var2为00001001,如果我编写上面的代码,则为var然后为00000000 00000000 00000000 00001001

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-04-19 20:36:48

我正在尝试将字符的8位转换为整数的最低有效位

char不能保证是8位的。可能会更多。此外,正如其他人所提到的,它可以是带符号的整数类型。在以下代码中,负的char值将转换为负的int值。

int var = (int) var2;

符号位被认为是最重要的,所以这段代码不会做你想要的事情。也许您的意思是从char转换为unsigned char (使其为正),然后转换为int (通过隐式转换):

代码语言:javascript
复制
int var = (unsigned char) var2;

如果您预计在您的用例场景中CHAR_BIT会超过8,您可能需要考虑使用模运算符来减少它:

代码语言:javascript
复制
int var = (unsigned char) var2 % 256;

但是我想知道,如果我写上面的代码,int中剩余的最高有效位(32-8=) 24位是随机的还是设置为0的?

当然,赋值将赋值整个值,而不仅仅是其中的一部分。

示例:假设var2为00001001,如果我写上面的代码,那么变量是00000000 00000000 00000000 00001001吗?

从语义上讲,是的。C标准要求int能够存储介于-32767和32767之间的值。您的实现可能会选择表示更大的范围,但这不是必需的。从技术上讲,int至少是16位。请记住这一点。

但是,对于负值的var2,(例如,二进制记法中的10000001 ),则符号位将被扩展。var最终将是10000000 00000001 (以二进制表示法)。

票数 1
EN

Stack Overflow用户

发布于 2013-04-19 19:50:14

C11 (n1570),§6.5.4 Cast运算符

表达式前面加上括号类型名称会将表达式的值转换为命名类型。

因此,var的剩余部分被设置为0。

顺便说一句,显式强制转换是不必要的。从char到int的转换是隐式的。

C11 (n1570),§6.3.1.1布尔、字符和整数

如果int可以表示原始类型的所有值(对于位字段,受宽度的限制),则将该值转换为int;否则,将其转换为unsigned int。这些被称为整数促销。

票数 5
EN

Stack Overflow用户

发布于 2013-04-19 20:06:28

C/C++编译器可以选择char类型是有符号的还是无符号的。

如果您的编译器定义了要签名的char,则在将其强制转换为int时,将对高位进行符号扩展。也就是说,它们要么全为0,要么全为1,具体取决于var2的符号位的值。例如,如果var2的值为-1 (十六进制,即0xff),则var在赋值后也将为-1 (在32位计算机上表示为0xffffffff )。

如果您的编译器将char定义为无符号,则高位将全为零。例如,如果var2的值为255 (也是0xff),则var的值将为255 (0x000000ff)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16103920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档