C語言中無符號數和有符號數相加比較的問題
轉自https://blog.csdn.net/supreme42/article/details/6687781
看個題:
#include<stdio.h>
int main()
{
unsigned int a=6;
int b=-20;
printf("%d\n",a+b);
(a+b)>6? puts(">6"):puts("<=6");
return 0;
}
結果是:-14 >6
意想不到吧?
為什麼結果這樣呢?
原來有符號數和無符號數進行比較運算時(==,<,>,<=,>=),有符號數隱式轉換成了無符號數(即底層的補碼不變,但是此數從有符號數變成了無符號數),比如上面 (a+b)>6這個比較運算,a+b=-14,-14的補碼為1111111111110010。此數進行比較運算時,被當成了無符號數,它遠遠大於6,所以得到上述結果。
相關推薦
C語言中無符號數和有符號數相加比較的問題
轉自https://blog.csdn.net/supreme42/article/details/6687781 看個題: #include<stdio.h> int main() { unsigned int a=6; int b=-20; printf("%d\n"
無符號數和有符號數(一) -- 原碼錶示法和補碼錶示法
無符號數: 即沒有符號的數。 在c語言中就是 unsigned 型別的。 無符號數在計算機中的儲存較為簡單, 因為沒有符號位, 直接將數字化成二進位制然後儲存在對應的儲存器或者暫存器中。 這時暫存器或
C語言中的子函式和主函式有什麼聯絡啊?它們是怎麼編寫的?
函式定義的一般形式1.無參函式的一般形式 型別說明符 函式名() { 型別說明 語句 } 其中型別說明符和函式名稱為函式頭。 型別說明符指明瞭本函式的型別,函式的型別實際上是函式返回值的型別。 該型別說明符與第二章介紹的各種說明符相同。 函式名是由使用者定義的識別符號,函式名後有一個空括號,其中無引數,但括
無符號位移和有符號位移
轉載:https://blog.csdn.net/BushQiang/article/details/79394211 https://blog.csdn.net/qq_26129689/article/detai
C語言中的淺拷貝和深拷貝
淺拷貝 首先看下面這段程式碼: # include<assert.h> # include<string.h> #include <stdlib.h> typedef struct Node//定義了一個結構體 { int size; char *da
C語言中的位運算子主要有哪些?邏輯右移與算術右移的區別?
邏輯右移與算術右移的區別? 邏輯右移就是不考慮符號位,右移一位,左邊補零即可。 算術右移需要考慮符號位,右移一位,若符號位為1,就在左邊補1,;否則,就補0。 所以算術右移也可以進行有符號位的除法,右移n位就等於除2的n次方。 例如,8位二進位制數11001101分別右移一位。 邏輯
C語言中的隨機數 srand ( ) 和 rand ( )
在C語言中,生成一個隨機數,一般利用兩個函式,即void srand ( unsigned int seed ) 和 int rand ( void )。 srand() 函式用於生成一個隨機數種子,種子的值等於引數seed,這個引數由我們指定一個
C語言中的單引號和雙引號的區別
首先肯定地說,二者是有區別的,不是說用誰都一樣。 1、實質區別,代表的含義不同 'A'代表的是一個整數,而且這個整數對應的是編譯器所採用的字符集中的字元序列對應的數值。所以'A'跟ASCII中的65意義是相同的。 1 # include <iostream>
C語言中的指標陣列和陣列指標
可以將 *string看成陣列 a[] 下的a,即指標是指向陣列的首地址的; 指標陣列是陣列元素為指標的陣列(例如 int *p[3],定義了p[0],p[1],p[2]三個指標),其本質為陣列。 指
C語言中宣告、定義和初始化的區別
函式和變數(全域性變數)都有宣告和定義, 對於函式而言: 同一檔案內,如果函式fun_1呼叫fun_2時,如果fun_2在fun_1之後定義,則需在fun_1之前對fun_2進行宣告,如下: void fun_2();// 宣告 void fun_1() { ... fu
C 語言中的結構體和共用體(聯合體)
本文主要總結了譚浩強主編的《C 程式設計》教材中結構體和共用體相關章節的內容。 在 C 語言中, 結構體(struct) 是一個或多個變數的集合,這些變數可能為不同的型別,為了處理的方便而將這些變數組織在一個名字之下。由於結構體將一組相關變數看作一個單元而不是各自獨立的實體,因此結構體有助於組織複雜的資料,
C語言中變數的宣告和定義
變數宣告和變數定義變數定義:用於為變數分配儲存空間,還可為變數指定初始值。程式中,變數有且僅有一個定義。變數宣告:用於向程式表明變數的型別和名字。定義也是宣告,extern宣告不是定義定義也是宣告:當定義變數時我們聲明瞭它的型別和名字。extern宣告不是定義:通過使用ext
C語言中棧的建立和應用
棧的特點為: 先進後出(first in last out)。 棧中有兩個指標,棧頂指標和棧尾指標。其中,棧尾指標是不動的。用棧頂指標等於棧尾指標來判定棧是否為空。壓棧時,將棧頂指標+1,然後將資料存
C語言中的靜態變數和普通變數的區別
下面用程式碼說明: 一個可執行程式包括BSS段、資料段、程式碼段(文字段)。 bss segment ,data segment ,code/text segment ①BSS(Block by Start Symbol) :通常指用來存放程式中未初化的全域性變數和靜態變數
關於C語言中返回區域性變數和區域性指標變數
char *test1(void) { char b[10] = "abcde"; return b; } char *test1_ver2(void) { static char b[10] = "abcde"; return b; } char *test2(voi
無符號整數和有符號整數比較的注意點
無符號整數和有符號整數比較注意 如果有符號整數是負數,則和無符號整數比較時結果錯誤。 尤其注意陣列的count和一個有符號整數比較這種情況。 NSUInteger x = 1; NSInteger y = -1; if(x>y){
js無符號數值和有符號數值轉化
function UnsignToSign(num){//無符號轉有符號 6553 --> -1 if(num>0xffff/2){ var a=~0xffff; num=num|a; } return num; } function sign
C語言中指標初始化和常規運算
1. 指標初始化注意須知 <1>指標變數和普通變數一樣,外部或者靜態指標變數若未初始化,則被自動初始化為NULL,它的值為0(ASCII字元NULL的程式碼)。 <2>可以
c語言分配記憶體方式有哪些?c語言中常見的記憶體錯誤有哪些?
記憶體分配方式有三種: 1、從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。 2、在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放
C語言中樹的建立和遍歷
樹的遍歷分為三種:前序遍歷(根左右),中序遍歷(左根右),後序遍歷(左右根)。 PS:根左右,就是先遍歷根節點,然後是左子樹,最後是右子樹。如下圖: 前序遍歷:ABDECF。 中序遍歷:DBEACF