C:使用8位char作为完整的int

时间:2013-04-19 11:48:13

标签: c bit-manipulation bit

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

进行
int var = (int) var2;

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

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

实施例: 如果我在上面编写代码,那么var200001001var然后是00000000 00000000 00000000 00001001吗?

4 个答案:

答案 0 :(得分:5)

  

C11(n1570),§6.5.4演员

     

通过带括号的类型名称前面的表达式转换   表达式到命名类型。

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

顺便说一句,明确的演员阵容是不必要的。从charint的转换是隐式

  

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

     

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

答案 1 :(得分:2)

C / C ++编译器可以选择char类型为有符号或无符号。

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

如果编译器将0xffffffff定义为无符号,则高位将全为零。例如,如果char的值为var2(再次为255),则0xff的值将为var255)。< / p>

答案 2 :(得分:1)

将名为char的{​​{1}}变量转换为c

  • 如果int为正数(例如24),那么c = c并在投出后将填充:< / p>

    00011000

  • 如果00000000 00000000 00000000 00011000为负数,例如-24,那么c = c并在投出后将填充

    11101000

答案 3 :(得分:1)

  

我正在尝试将char的8位转换为最不重要的   int的位

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,如果我编写上面的代码,则为var   00000000 00000000 00000000 00001001?

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

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