0

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

int var = (int) var2;

其中 var2 是类型char(甚至没有 put (int))。

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

示例:假设var200001001如果我编写上面的代码,var那么是00000000 00000000 00000000 00001001吗?

4

4 回答 4

5

C11 (n1570), § 6.5.4 转换运算符

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

因此,其余的var设置为 0。

顺便说一句,显式演员表是不必要的。从charto的转换int隐式的。

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

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

于 2013-04-19T11:50:13.840 回答
2

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

如果您的编译器定义char为有符号,则在转换为int. 也就是说,它们要么全为零,要么全为 1,具体取决于 的符号位的值var2。例如,如果var2有值-1(十六进制,即0xff),var也将-1在赋值之后(0xffffffff在 32 位机器上表示)。

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

于 2013-04-19T12:06:28.390 回答
1

用于将char名为的变量c转换为int

  • 如果c是正数,例如 24,则c=00011000并且在转换后它将被填充:

    00000000 00000000 00000000 00011000

  • 如果c是负数,例如 -24,则c=11101000并且在转换后它将被填充

    11111111 11111111 11111111 11101000

于 2013-04-19T11:49:52.967 回答
1

我正在尝试将 char 的 8 位转换为 int 的最低有效位

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

int var = (int) var2;

符号位被认为是最重要的,所以这段代码没有做你想做的事。也许您的意思是转换 from charto unsigned char(使其成为正数),然后 to 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 之间的值。您的实现可以选择表示更大的范围,但这不是必需的。从技术上讲,an至少为 16int位。要时刻铭记在心。

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

于 2013-04-19T12:36:48.347 回答