牛客上有一些題目,只需要看輸出格式就可以了,不用想太複雜。
1. 不管是有符號數還是無符號數,printf控制輸出如果%d之類的,顯示在屏幕上的都是有符號數。所以有些題目不用想那麼複雜。
題目:下列C程序執行後c輸出結果爲( )(32位)(-1)
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a = -3;
unsigned int b = 2;
long c = a + b;
printf("%ld\n",c);
}
有些人會想到,unsigned和signed遇見,有符號整數會被提升爲無符號整數。所以balabala想了一堆,最後還選擇一個錯誤答案,對,那就是我。這題不用看,控制格式輸出是輸出的%d,不管你怎麼提升,最後結果都是-1。
我在VS2012環境下測試過了,如果上述代碼改爲:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a = -3;
unsigned int b = 2;
unsigned int c = a + b;//或者unsigned long int
printf("%ld\n",c);
}
答案是一模一樣的。而如果把之前代碼改成:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a = -3;
unsigned int b = 2;
long c = a + b;
printf("%u\n",c);
}
那麼答案是0xfffffff。
但是接下來開始,如果是c++中std::cout<<輸出,那麼是這樣的:
#include<iostream>
void main()
{
int a = -3;
unsigned int b = 2;
unsigned long c = a + b;
std::cout<<c;
}
答案是0xfffffff。
#include<iostream>
void main()
{
int a = -3;
unsigned int b = 2;
long c = a + b;
std::cout<<c;
}
答案是-1。