我正在尝试将char的8位转换为int的最低位。我知道从char
到int
的转换很容易通过
int var = (int) var2;
其中var2的类型为char
(甚至没有放置(int)
)。
但是我想知道,如果我写上面的代码,int
的剩余最高有效(32-8 =)24位是随机的还是设置为0?
实施例:
如果我在上面编写代码,那么var2
为00001001
是var
然后是00000000 00000000 00000000 00001001
吗?
答案 0 :(得分:5)
C11(n1570),§6.5.4演员
通过带括号的类型名称前面的表达式转换 表达式到命名类型。
因此,var
的剩余部分设置为0.
顺便说一句,明确的演员阵容是不必要的。从char
到int
的转换是隐式。
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
的值将为var
(255
)。< / 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
(二进制表示法)。