gpt4 book ai didi

c - 类型转换 : signed int to unsigned long in C

转载 作者:太空狗 更新时间:2023-10-29 15:02:21 25 4
gpt4 key购买 nike

我目前正在阅读 The C Programming Language (K&R) 的第 2 章并阅读有关按位运算的内容。

这个例子激发了我的好奇心:

x = x & ~077

假设一个 16 位字长和 32 位长类型,我认为会发生的是 077 首先被转换为:

0000 0000 0011 1111 (16 bit signed int).

这将被补充为:

1111 1111 1100 0000.

我的问题是 x 的不同可能类型接下来会发生什么?如果 x 是一个带符号的整数,那么答案是微不足道的。但是,如果 x 是一个有符号的 long,我假设 ~077 会变成:

1111 1111 1111 1111 1111 1111 1100 0000

后面的2s补码保留符号。这是正确的吗?

此外,如果 x 是无符号长整型,~077 将变为:

0000 0000 0000 0000 1111 1111 1100 0000

或者,先将 ~077 转换为有符号长整型:

1111 1111 1111 1111 1111 1111 1100 0000

...之后将其转换为无符号长整型(位不变)?

任何帮助都可以帮助我弄清楚此操作是否始终仅将最后 6 位设置为零。

最佳答案

无论您选择什么数据类型,~077 都会将最右边的 6 位设置为 0,将所有其他位设置为 1

假设16位int和32位long,有4种情况:

案例一

unsigned int x = 077; // x = 0000 0000 0011 1111
x = ~x; // x = 1111 1111 1100 0000
unsigned long y = ~x; // y = 0000 0000 0000 0000 1111 1111 1100 0000

案例二

unsigned int x = 077; // x = 0000 0000 0011 1111
x = ~x; // x = 1111 1111 1100 0000
long y = ~x; // y = 0000 0000 0000 0000 1111 1111 1100 0000

案例三

int x = 077; // x = 0000 0000 0011 1111
x = ~x; // x = 1111 1111 1100 0000
unsigned long y = ~x; // y = 1111 1111 1111 1111 1111 1111 1100 0000

案例4

int x = 077; // x = 0000 0000 0011 1111
x = ~x; // x = 1111 1111 1100 0000
long y = ~x; // y = 1111 1111 1111 1111 1111 1111 1100 0000

见代码here .这意味着当源被签名时,签名扩展就完成了。当源为unsigned时,符号位不扩展且左侧位设置为0

关于c - 类型转换 : signed int to unsigned long in C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20345489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com