C語言進階之路-基本數據小怪篇

目錄

一、學習目標:

二、數據基本類型

整型

浮點型 / 實型

字符

字符串

布爾型數據

三、重要的雜七雜八知識點

常量與變量

標準輸入

sizeof運算符:

類型轉換

數據類型的本質

整型數據尺寸

可移植性整型

拿下第一個C語言程序

總結


一、學習目標:

知識點:

  • 一文掌握 C 語基礎數據類型
  • 掌握常量變量運用、輸入輸出等操作
  • 簡單了解內存大小計算和類型轉換

二、數據基本類型

整型

  • 概念:表達整數類型的數據
  • 語法:

int a = 123;

// 定義了一個專門用來存儲整數的變量a

  • 需要注意的地方:
  1. int 的本意是 integer,即整數的意思
  2. int a 代表在內存中開辟一塊小區域,稱為 a,用來存放整數,a 一般被稱為變量。
  3. 變量 a 所占內存大小,在不同的系統中是不一樣的,64位 32 位 系統典型的大小是4個字節
  4. 變量 a 有固定的大小,因此也有取值范圍,典型的范圍是:-2147483648到2147483647
  • 整型修飾符
    • short:用來縮短整型變量的尺寸,減少取值范圍并節省內存,稱為短整型
    • long:用來增長整型變量的尺寸,增大取值范圍并占用更多內存,稱為長整型
    • long long:用來增長整型變量的尺寸,增大取值范圍并占用更多內存,稱為長長整型
    • unsigned:用來去除整型變量的符號位,使得整型變量只能表達非負整數
short int a; // 短整型 
long int b; // 長整型 
long long int c; // 長長整型 
unsigned int e; // 無符號整型 
unsigned short int f; // 無符號短整型 
unsigned long int g; // 無符號長整型 
unsigned long long int h; // 無符號長長整型
  • 使用整型修飾符后,關鍵字 int 可以被省略:
short a; // 短整型 
long b; // 長整型 
long long c; // 長長整型 
unsigned e; // 無符號整型 
unsigned short f; // 無符號短整型 
unsigned long g; // 無符號長整型 
unsigned long long h; // 無符號長長整型
  • 符號位:
    • 有符號的整型數據,首位(最高位)為符號位,0表示正數,1表示負數。
    • 無符號的整形數據,沒有符號位。
  • 編碼形式:
    • 原碼:正數直接使用二進制來表達,比如a=100,在內存中是 00…001100100
    • 補碼:負數用絕對值取反加一來表達,比如a=-3,在內存中是11…1111111101
    • 補碼 = 該負數的絕對值的源碼 --> 取反 --> + 1

  • 注意負數的補碼在取反加一的時候,符號位是不動的
  • 溢出:超過數據所能表達的范圍,稱為溢出,就像汽車里程表,最大值和最小值是相鄰的

  • 進制:源碼中可以使用八進制、十進制或十六進制,但實際數據在內存中一律是二進制存儲
    • 十進制(默認),比如1099
    • 八進制,比如013 (這里的0 是八進制的前綴)
    • 十六進制,比如0x6FF0A (0x 則是16進制的前綴)

// 以下3個變量看起來都是 100 但實際由于進制不同則他們表示的數值有有差異:

int a1 = 100 ;? ? ?int a2 = 0100;? ? ? int a3 = 0x100 ;

格式控制符

十進制輸出: int 整型:%d short 整型:%hd, h代表half,即一半的存儲字節 long 整型:%ld long long 整型:%lld 八進制輸出: 顯示不同進制的前綴: %#o 十六進制輸出: %#x

示例:

// 以下3個變量看起來都是 100 但實際由于進制不同則他們表示的數值有有差異
int a1 = 100 ;
int a2 = 0100;
int a3 = 0x1AB ;printf("a1:%d a2:%d a3:%d\n" , a1 , a2 , a3);  // %d 十進制輸出整形
printf("a1:%#x a2:%#x a3:%#X\n" , a1 , a2 , a3); // %x 十六進制輸出整形  # 則可以輸出十六進制的前綴0x// x 可以是大寫也可以是小寫,對應的是十六進制中字符的大小寫//  %#x  -> 0xab//  %#X  -> 0XAB short s ;
int i ;
long l ;
long long ll ;printf( "s:%d\n" , s  );
printf( "i:%d\n" , i  );
printf( "l:%ld\n" , l  );
printf( "ll:%lld\n" , ll  );

浮點型 / 實型

  • 概念:用來表達實數的數據類型
  • 分類:
    • 單精度浮點型(float),典型尺寸是4字節
    • 雙精度浮點型(double),典型尺寸是8字節
    • 長雙精度浮點型(long double),典型尺寸是16字節
    • 占用內存越多,能表達的精度越高
float f1; // 單精度
double f2; // 雙精度 
long double f3; // 長雙精度

1234.5678 -> 1.2345678*10^3

0.0001234567 -> 1.234567*10^-4

字符

實際上他就是一個單字節的整形,也可以與整形一樣參與運算。

char ch1 = 'a';  // 'a'是字符常量,代表字母a的ascii值 97
char ch2 = '\n'; // '\n'是不可見字符常量,代表回車

????????計算機中存儲的都是1和0,因此各種字符都必須被映射為某個數字才能存儲到計算機中,這種映射關系形成的表稱為 ASCII 碼表。

字符本質上就是一個單字節的整型,支持整型所有的運算

比如:

char c1 = 20;
char c2 = c1 + 'a'; // 等價于 char c2 = 20 + 97;printf("%c\n", c2); // 以字符形式輸出117,即 'u'
printf("%d\n", c2); // 以整型形式輸出117

字符串

  • 定義
// 字符串的定義方式有兩種:指針和數組
char *s1 = "abcd"; // 使用字符指針來指向一個字符串
char s2[]= "abcd"; // 使用字符數組來存儲字符串// 注意,使用數組來定義字符串時,方括號[]里面的數字可以省略
// 不省略也可以,但必須必字符串實際占用的內存字節數要大,比如:
char s3[] = "apple";
  • 在內存中的存儲
    • 在內存中實際上是多個連續字符的組合
    • 任何字符串都以一個 ‘\0’ 作為結束標記,例如:“funny story” 的內存如下

布爾型數據

  • 概念:布爾型數據只有真、假兩種取值,非零為真,零為假。
  • 語法:
bool a = 1; // 邏輯真,此處1可以取其他任何非零數值
bool b = 0; // 邏輯假 
  • 注意:
  1. 邏輯真除了 1 之外,其他任何非零數值都表示邏輯真,等價于 1。
  2. 使用布爾型 bool 定義變量時需要包含系統頭文件 stdbool.h。
  • 布爾型數據常用語邏輯判斷、循環控制等場合。

三、重要的雜七雜八知識點

常量與變量

  • 概念:不可改變的內存稱為常量可以改變的內存稱為變量

舉例:

int a = 100; // a是變量,而100是常量float f = 3.14; // f是變量,而3.14是常量char s[] = "abcd"; // s是變量,"abcd"是常量
  • 常量的類型

常量舉例

說明

類型

100

整型

int

100L

長整型

long

100LL

長長整型

long long

100ULL

無符號長長整型

unsigned long long

3.14

雙精度浮點型

double

3.14L

長雙精度浮點型

long double

‘a’

字符型

char

“abcd”

字符指針(字符串)

char *

標準輸入

  • 概念:鍵盤是系統的標準輸入設備,從鍵盤中輸入數據被稱為標準輸入
  • 相關函數:
scanf(); // 格式化輸入函數 
fgets(); // 字符串輸入函數int a;
float f;
scanf("%d", &a);   // 從鍵盤輸入一個整型,放入指定的內存地址 &a 中
scanf("%f", &f);   // 從鍵盤輸入一個浮點數,放入指定的內存地址 &f 中scanf("%d%f", &a, &f); // 從鍵盤依次輸入一個整型和一個浮點型數據,用空白符隔開char c;
char s[10];
scanf("%c", &c);  // 從鍵盤輸入一個字符,放入指定的內存地址 &f 中
scanf("%s", s );  // 從鍵盤輸入一個單詞,放入指定的數組 s 中(注意不是&s)fgets(s, 10, stdin); // 從鍵盤輸入一行字符串,放入數組 s 中
  • 注意1:
    • scanf() 與 printf() 不同,scanf() 的格式控制串不可亂寫,尤其是結尾處的 \n
    • 用戶必須完全按照 scanf() 中描述的輸入格式控制串來輸入數據,否則將出錯。
    • 示例:
// 此處輸入時必須帶逗號
scanf("%d,%d", &a, &b);// 此處必須先輸入a=,然后才能輸入整數
scanf("a=%d", &a); // 此處結束輸入時按下的回車符將被scanf()誤以為格式控制符,無法正常結束輸入
scanf("%d\n", &a); 

實例:

#include <stdio.h>int main(int argc, char const *argv[])
{int i = 0;char ch = 0;float f  = 0;char buf [32] = {0};// 如下所示,如果在輸入多項數據的時候, 從左往右第一項不匹配后會導致往后的所有項目輸入終止int ret_val = scanf( "a=%d ch=%c f=%f buf=%s" , &i , &ch , &f , buf );// 如果輸入表達式如上所示使用空格進行分割各種類型的控制符,那么在輸入的時候可以匹配空格 、 Tab 、 回車// 如果 scanf( "%d,%s,%c" , ...); 這么寫在輸入時就必須使用 ,(逗號) 進行分割// 注意千萬不要手賤在 格式控制符中加上 \n 不然會出現迷惑現象,必須多輸入一個無用的數據+\n才能解脫printf("成功輸入:%d項數據..\n" , ret_val);printf("i:%d ch:%d f:%f  buf:%s\n" , i , ch , f , buf );return 0;
}

總結:

    • sacnf 它默認從指定的文件(默認是標準輸入文件)中獲取指定格式的數據。
    • 格式包含 數據的類型(%d %s %c %f ..) 以及 樣式(a=%d ch=%c \ %d,%c,%f)
    • 如果輸入樣式中各項數據使用 空格分隔則與之匹配的符號可以是 空格 、 TAB 、 回車
    • 如果用戶輸入的數據不匹配則scanf 會立馬停止工作,剩余的數據會留在緩沖區

拓展:

sizeof運算符:

 int a = 123 ;printf("%ld\n" , sizeof a );// 當使用sizeof 求某一個變量的大小時可以省略括號
printf("%ld\n" , sizeof (a) );
printf("%ld\n" , sizeof(int) );printf("short: %ld\n" , sizeof(short) );  // 2
printf("int :%ld\n" , sizeof(int) );  // 4
printf("long : %ld\n" , sizeof(long) );  // 4(32位系統) / 8(64位系統)
printf("long long :%ld\n" , sizeof(long long ) );  // 8 (32 \ 64 位系統)

類型轉換

  • 概念:不一致但相互兼容的數據類型,在同一表達式中將會發生類型轉換。
  • 轉換模式:
    • 隱式(默認)轉換:系統按照隱式規則自動進行的轉換
    • 強制(手動)轉換:用戶顯式自定義進行的轉換
  • 隱式規則:從小(低精度)類型向大(高精度)類型轉換,目的是保證不丟失表達式中數據的精度

隱式轉換示例代碼

char a = 'a'; int b = 12; float c = 3.14; float x = a + b - c;// 在該表達式中將發生隱式轉換,所有操作數被提升為float
  • 強制轉換:用戶強行將某類型的數據轉換為另一種類型,此過程可能丟失精度
char a = 'a'; int b = 12; float c = 3.14; float x = a + b - (int)c;// 在該表達式中a隱式自動轉換為int,c被強制轉為int

????????不管是隱式轉換,還是強制轉換,變換的都是操作數在運算過程中的類型,是臨時的,操作數本身的類型不會改變,也無法改變。

數據類型的本質

  • 概念:各種不同的數據類型,本質上是用戶與系統對某一塊內存數據的解釋方式的約定。
  • 推論:
    • 類型轉換,實際上是對先前定義時候的約定,做了一個臨時的打破。
    • 理論上,可以對任意的數據做任意的類型轉換,但轉換之后的數據解釋不一定有意義。
17620828909 電話 
17620828909 余額
int a = 123 ;
float 123

整型數據尺寸

  • 概念:整型數據尺寸是指某種整型數據所占用內存空間的大小
  • C語言標準并未規定整型數據的具體大小,只規定了相互之間的 “ 相對大小 ” ,比如:
    • short 不可比 int 長 , 一般short為int 的一半
    • long 不可比 int 短
    • long 型數據長度等于系統字長
  • 系統字長:CPU 一次處理的數據長度,稱為字長。比如32位系統、64位系統。
  • 典型尺寸:
    • char 占用1個字節
    • short 占用2個字節
    • int 在16位系統中占用2個字節,在32位和64位系統中一般都占用4個字節
    • long 的尺寸等于系統字長 , 在32位系統中4字節, 在64位系統中8字節
    • long long 在32位系統中一般占用8個字節,在64位系統中一般占用8個字節
  • 存在問題:
    • 同樣的代碼,放在不同的系統中,可能會由于數據尺寸發生變化而無法正常運行。
    • 因此,系統標準整型數據類型,是不可移植的(不具備可移植性),這個問題在底層代碼中尤為突出。

可移植性整型

  • 概念:不管放到什么系統,尺寸保持不變的整型數據,稱為可移植性整型
  • 關鍵:typedef (給現有的類型取別名)
typedef int int32_t; // 將類型 int 取個別名,稱為 int32_t 
typedef long int64_t;// 將類型 long 取個別名,稱為 int64_t
  • 思路:
    • 為所有的系統提供一組固定的、能反應數據尺寸的、統一的可移植性整型名稱
    • 在不同的系統中,為這些可移植性整型提供對應的 typedef 語句

#include <stdio.h>int main(int argc, char const *argv[])
{long l = 345 ;  // 不具備可移植的屬性,因在不不同的系統中他的大小有可能發生變化__int64_t  k = 567 ; // 可移植數據類型,在不同的系統中他的大小都是固定的printf("long:%ld\n" , sizeof(long));printf("long long :%ld\n" , sizeof(long long));printf("__int64_t:%ld\n" , sizeof(__int64_t));return 0;
}

拿下第一個C語言程序

總結

? ? ? ? 本文介紹了C的一些基本類型知識和類型轉換要點,還有變量、常量等其他知識。理解本文所有知識點后,便可編譯一個屬于自己的小程序,算上是窺得C語皮毛矣

? ? ? ? 本文參照?粵嵌文哥 部分課件經整理和修改后發布在C站,如有轉載,請聯系本人

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/168235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/168235.shtml
英文地址,請注明出處:http://en.pswp.cn/news/168235.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UE小計:頂部工具欄按鈕添加下拉列表,大綱列表、資源管理窗口右鍵添加按鍵

下拉列表 void FYouPluginsModule::StartupModule() {FYouToolStyle::Initialize();FYouToolStyle::ReloadTextures();FYouToolCommands::Register();PluginCommands MakeShareable(new FUICommandList);PluginCommands->MapAction(FYouToolCommands::Get().PackByCloudAc…

web前端之引入svg圖片、html引入點svg文件、等比縮放、解決裁剪問題、命名空間、object標簽、阿里巴巴尺量圖、embed標簽、iframe標簽

MENU 前言直接在頁面編寫svg使用img標簽引入通過css引入使用object標簽引入其他標簽參考資料 前言 web應用開發使用svg圖片的方式&#xff0c;有如下幾種方式 1、直接在頁面編寫svg 2、使用img標簽引入 3、通過css引入 4、使用object標簽引入 直接在頁面編寫svg 在html頁面直接…

LeetCode Hot100 101.對稱二叉樹

題目&#xff1a; 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 代碼&#xff1a; class Solution {public boolean isSymmetric(TreeNode root) {if(rootnull || (root.leftnull && root.rightnull)) {return true;}//用隊列保存節點LinkedList<…

高防CDN在網站搭建中的優劣勢分析

隨著網絡攻擊的日益增多和惡性化&#xff0c;網站安全性成為網站搭建中至關重要的一環。高防CDN&#xff08;Content Delivery Network&#xff09;作為一種有效的安全防護手段&#xff0c;扮演著保護網站免受惡意攻擊的角色。本文將從網站搭建的角度&#xff0c;深入分析高防C…

vue3+ts+vite 打包報錯 TS2304: Cannot find name ‘xxx‘

都說vue組合式api好&#xff0c;那必須來一套試試&#xff0c;而且element ui的demo全是lang"ts"了 改成組合式api沒問題&#xff0c;但是當加上lang"ts"之后就瘋狂報錯 src/components/table/tableshow.vue:7:28 - error TS2304: Cannot find name tempsh…

【網易云商】構建高效 SaaS 系統的技術要點與最佳實踐

SaaS 是什么 定義 相信大家都對云服務中的 IaaS、PaaS、SaaS 早就有所耳聞&#xff0c;現在更是衍生出了 aPaaS、iPaaS、DaaS 等等的類似概念。對于 SaaS 也有各種各樣的定義&#xff0c;本文給出的定義是&#xff1a; SaaS 是一種基于互聯網提供服務和軟件的交付模式&#xf…

水果編曲軟件FL Studio21.2下載安裝教程

簡稱FL&#xff0c;全稱&#xff1a;Fruity Loops Studio&#xff0c;因此國人習慣叫它"水果"。目前最新版本(包括測試版本)是FL Studio21.2&#xff0c;它讓你的計算機就像是全功能的錄音室&#xff0c;大混音盤&#xff0c;非常先進的制作工具&#xff0c;讓你的音…

工業以太網交換機未來發展中的幾個趨勢

隨著工業自動化不斷發展和智能制造的推進&#xff0c;工業以太網交換機在未來的應用中將面臨更多的發展機遇和挑戰。在工業以太網交換機的未來發展中&#xff0c;有幾個方面將成為趨勢。 網絡虛擬化 隨著工業自動化系統規模的不斷擴展&#xff0c;網絡虛擬化將成為未來的發展方…

總結1065

今日共計學習11h47m&#xff0c;今日圖書館冷清了不少&#xff0c;在最后關頭&#xff0c;越學心里越沒譜。做22年的真題做到懷疑人生&#xff0c;真題每年難度不一&#xff0c;可以出的很難&#xff0c;也可以出得相對簡單。出的難的&#xff0c;計算量大肯定是其中一部分。今…

四、防火墻-NAT Server

學習防火墻之前&#xff0c;對路由交換應要有一定的認識 NAT Server1.1.基本原理1.2.多出口場景下的NAT Server1.3.源進源出 —————————————————————————————————————————————————— NAT Server 一般對用戶提供一些可訪問的…

Python開發運維:Django 4.2.7 使用Celery 5.3.5 完成異步和定時任務

目錄 一、實驗 1.Django使用Celery完成異步和定時任務 二、實驗 1. 如何查看Django版本 一、實驗 1.Django使用Celery完成異步和定時任務 (1)安裝Django (2)新建Django項目 (3)初始框架 (4)urls.py引用視圖views from django.contrib import admin from django.urls imp…

python之UDP網絡應用程序開發

文章目錄 版權聲明UDP網絡應用程序開發UDP初識UDP知識要點socket類的使用UDP發送數據開發流程分析UDP服務客戶端通信栗子UDP廣播發送 版權聲明 本博客的內容基于我個人學習黑馬程序員課程的學習筆記整理而成。我特此聲明&#xff0c;所有版權屬于黑馬程序員或相關權利人所有。…

CodeWhisperer 體驗總結

CodeWhisperer 體驗總結 | CodeWhisperer 是一款亞馬遜新推出的通用代碼生成器 可以實時進行代碼數據的提供 還可以定義安全問題 CodeWhisperer 對個人用戶是免費使用 企業用戶需要訂閱使用 亞馬遜云科技開發者社區為開發者們提供全球的開發技術資源。這里有技術文檔、開發案例…

Linux:配置Ubuntu系統的鏡像軟件下載地址

一、原理介紹 好處&#xff1a;從國內服務器下載APT軟件&#xff0c;速度快。 二、配置 我這里配置的是清華大學的鏡像服務器地址 https://mirrors.tuna.tsinghua.edu.cn/ 1、備份文件 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak2、清空sources.list ec…

廣告機/商業顯示屏_基于MT8788安卓主板方案

安卓主板在廣告機領域扮演著重要的角色。無論是在商場、車站、酒店、電梯、機場還是高鐵站&#xff0c;LED廣告機廣泛應用&#xff0c;并通過不同方式進行播放和管理。 廣告機/商業顯示屏_基于MT8788安卓主板方案 基于MT8788安卓主板方案的廣告機采用了聯發科MT8788八核芯片方案…

國標直流充電槍9孔分別啥意思?

DC&#xff1a;直流電源正 DC-&#xff1a;直流電源負 PE&#xff1a;接地&#xff08;搭鐵&#xff09;S&#xff1a;通訊CAN-H S-&#xff1a;通訊CAN-L CC1&#xff1a;充電連接確認 CC2&#xff1a;充電連接確認 A&#xff1a;12V A-&#xff1a;12V- 以上就是國標直流充電…

線上ES集群參數配置引起的業務異常案例分析

本文介紹了一次排查Elasticsearch node_concurrent_recoveries 引發的性能問題的過程。 一、故障描述 1.1 故障現象 1. 業務反饋 業務部分讀請求拋出請求超時的錯誤。 2. 故障定位信息獲取 故障開始時間 19:30左右開始 故障拋出異常日志 錯誤日志拋出timeout錯誤。 故障之前…

BTC 復興:Ordinals 帶來創新活力,BitVM 與 BitStream 相繼問世

除了備受矚目的 ETF&#xff0c;今年 Bitcoin 生態迎來全新的發展活力和機遇。Ordinals 協議的橫空出世&#xff0c;以此為基礎誕生的 BRC20 協議給整個比特幣生態帶去了一波新的能量&#xff0c;迎來銘文熱度高漲。而諸如 BitVM、BitStream 等新技術甫一問世&#xff0c;便引發…

openssl+ RSA + linux 簽名校驗開發實例(C++)

文章目錄 一、RSA簽名校驗二、RSA簽名校驗開發實例 一、RSA簽名校驗 RSA簽名校驗是一種用于驗證數字簽名的過程&#xff0c;它確保簽名是由擁有相應私鑰的合法實體創建的。以下是RSA簽名校驗的理論知識點&#xff1a; RSA密鑰對&#xff1a; RSA簽名使用一對公鑰和私鑰。公鑰用…

RPCS3(PlayStation 3游戲模擬器)漢化教程

RPCS3 RPCS3 是一款PlayStation 3 模擬器&#xff0c;可讓 Windows、Linux 或 BSD 系統的用戶運行索尼 PlayStation 3 游戲。 安裝教程 包含 Windows/Linux版本 詳細安裝漢化教程請查看文章 RPCS3&#xff08;PS3模擬器&#xff09;安裝及漢化教程 1.首先下載最新版 RPCS3模…