gpt4 book ai didi

c - 数据类型修饰符和移位运算符

转载 作者:太空狗 更新时间:2023-10-29 17:21:36 28 4
gpt4 key购买 nike

int main(void)  
{

unsigned i = -23; // line 1
short a, b = 0x1;

printf("sizeof(short) = %i\n", (int)sizeof(short)); // line 2

a = b << 31; // line 3
printf("i = %i", i); // line 4
printf("i = %u", i); // line 5

return 0;
}

为什么在指定类型修饰符 unsigned 时第 1 行没有给出任何错误?

第 2 行在我的系统中将 sizeof(short) 打印为 2 个字节。 a & b 是短整数,因此有 2 个字节或 16 位长。但是第 3 行不会抛出任何错误。当字长仅为 16 位时,如何左移 31 位??

第4行和第5行有隐式转换吗?

我在 64 位 Mac 上使用 GCC 编译器。

最佳答案

  1. 您不会收到错误,因为负整数常量被隐式转换为无符号值,成为一个非常大的数字(MSB 设置为 1)
  2. 一个值被隐式转换为int1,2,移位并赋值回来;当数字转换回 short 时,您会得到全零,但这是未定义的行为3
  3. C意义上的第4行和第5行没有转换;与将参数传递给可变函数相关的常规类型提升确实适用。然而,printf 在第 4 行将 unsigned 重新解释为 singed:格式说明符是唯一告诉 printf 传递给它的参数类型的东西。<

1转移前的促销:link .

2整数促销:link .

3 移动 30 就可以了,因为 2^30 可以表示为 int

关于c - 数据类型修饰符和移位运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11642653/

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