Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 有人能解释这个答案是如何计算的吗? #包括 int main() { printf(“%x”,-1_C - Fatal编程技术网

C 有人能解释这个答案是如何计算的吗? #包括 int main() { printf(“%x”,-1

C 有人能解释这个答案是如何计算的吗? #包括 int main() { printf(“%x”,-1,c,C,在我看来,这个答案只是您的32位编译器(隐式地)将有符号整数的-1转换为long int,而16位编译器将1转换为“好的旧int16位整数 糟糕的答案。吉勒的“停止作恶”在上面给出了一个更好的答案。我只是编辑了这个,所以它不是绝对没有意义的 如上所述,-1是一个有符号整数,左移(请参阅)负的有符号整数会导致未定义的行为,因为符号位无处可去。在我工作过的所有系统中,这种行为都是溢出 16位和32位编译器的结果不同的原因可能是16位编译器使用16位整数,因此16位结果fffe。我附上了一些代码供您试

在我看来,这个答案只是您的32位编译器(隐式地)将有符号整数的
-1
转换为
long int
,而16位编译器将
1
转换为“好的旧
int
16位整数

糟糕的答案。吉勒的“停止作恶”在上面给出了一个更好的答案。我只是编辑了这个,所以它不是绝对没有意义的

如上所述,
-1
是一个有符号整数,左移(请参阅)负的有符号整数会导致未定义的行为,因为符号位无处可去。在我工作过的所有系统中,这种行为都是溢出

16位和32位编译器的结果不同的原因可能是16位编译器使用16位整数,因此16位结果
fffe
。我附上了一些代码供您试用,它会很有用

附脏测试

#include<stdio.h>
int main()
{
   printf("%x", -1<<1);
   getchar();
   return 0;
}
/*dirty\u test.c
*该程序将一个有符号整数左移位,然后
*将结果的字节内容打印到标准输出。
*
*在*nix类系统上,使用
*
*cc dirty_test.c-o dirty_test.x
*/
#包括
内部主(空)
{
INTA;
//赋值为负值会导致位移位
//溢出产生溢出。
a=-1;
printf(“移位前字节:%08x\n”,a);

printf(“移位后的字节:%08x\n”,a
-1
是一个有符号整数。根据C语言的形式定义,带负数的有符号整数上的左移位是有符号的。这是有符号操作溢出时具有未定义行为的一般规则的一部分。有符号位已设置,必须移位,但没有空间移动,因此无法移动流动

实际上,几乎所有平台都使用有符号整数的表示,有符号整数的左移位被视为内存中包含无符号整数。但是,请注意,编译器有时会利用这是未定义的行为这一事实,以令人惊讶的方式进行优化

-1
是所有位的1,因此左移位会将最上面的位降下来,并在最下面添加一个0位。结果是二进制的
111…1110
。如果
无符号int
是16位类型,那就是十六进制的
fffe
。如果
无符号int
是32位类型,那就是
fffffff e
。当该内存被读取为签名为
int
,值为
-2


指定的
%x
需要一个
无符号int
作为参数。向类型的有符号版本传递一个参数是可以的:它被转换为无符号值。转换的结果是2^N-2,其中N是
无符号int
中的位数:如上所述,如果N=16,
0xfffffe
则为
0xfffe
f N=32。

更好:
-1U没有涉及
长的
。这对于C编译器来说是不正确的,而且它也不能解释问题中报告的行为。我同意我的答案确实是错误的,令人困惑。我一定很困。我将尝试不再回答写得不好的答案。我编辑的目的是成为一名把你写的东西写得很长(不管怎么说,这也是我一直在想的)。我为写这么愚蠢的事道歉。-佩德罗
/* dirty_test.c
 * This program left bit-shifts a signed integer and
 * prints the byte content of the result to stdout.
 *
 * On *nix like systems, compile with
 *
 * cc dirty_test.c -o dirty_test.x
 */
#include <stdio.h>
int main(void)
{
    int a;
    // assigning a negative value causes the bit shift 
    // to produce an overflow.
    a = -1;
    printf("bytes before shift: %08x\n", a);
    printf("bytes after shift: %08x\n", a << 1);
    return 0;
}