我正在尝试将char的8位转换为int的最低有效位。我知道从char到int的转换很容易通过
int var = (int) var2;其中var2的类型为char (甚至不放置(int))。
但是我想知道,如果我写上面的代码,int的其余最高有效位(32-8=) 24位是随机的还是设置为0?
示例:假设var2为00001001,如果我编写上面的代码,则为var然后为00000000 00000000 00000000 00001001
发布于 2013-04-19 20:36:48
我正在尝试将字符的8位转换为整数的最低有效位
char不能保证是8位的。可能会更多。此外,正如其他人所提到的,它可以是带符号的整数类型。在以下代码中,负的char值将转换为负的int值。
int var = (int) var2;
符号位被认为是最重要的,所以这段代码不会做你想要的事情。也许您的意思是从char转换为unsigned char (使其为正),然后转换为int (通过隐式转换):
int var = (unsigned char) var2;如果您预计在您的用例场景中CHAR_BIT会超过8,您可能需要考虑使用模运算符来减少它:
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 (以二进制表示法)。
发布于 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。这些被称为整数促销。
发布于 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)。
https://stackoverflow.com/questions/16103920
复制相似问题