簡體   English   中英

C中有符號和無符號字符之間的區別

[英]Difference between in signed and unsigned char in c

C中有符號和無符號char什么區別? 當我嘗試運行以下代碼且未unsigned它進入了無限循環,因為已簽名char的范圍最大為127 (為什么默認情況下會對其進行簽名?)。 但是,當我添加unsigned (其范圍最大為255)時,它可以正常工作。 什么原因 ?

#include <stdio.h>

int main() {
    unsigned char x;
    x = 0;
    while (x <= 225) {
         printf("%c=%d\n", x, x);
         x = x + 1;
    }
    return 0;
}

C語言中沒有專用的“字符類型”。 char是一個整數類型,與int,short和其他整數類型相同(就此而言)。

  • 它們都是整數類型。
  • 它們具有相同的大小(一個btye)。

如果您將數字用作字符

  • 帶符號的字符,至少為-127至127。 (-128至127是常見的)
  • 無符號字符,至少為您提供0到255的范圍。

從3.9.1基本類型開始

普通字符,有符號字符和無符號字符是三種不同的類型。 一個char,一個已簽名char和一個未簽名char占用相同的存儲量,並具有相同的對齊要求(3.11); 也就是說,它們具有相同的對象表示形式。

與聲明

x=x+1;

有一些事情正在發生。

首先將對表達式x + 1求值。 這將導致x值的常規算術轉換 ,因此它升為int (提升的)值將增加1 ,然后將結果分配回x 問題就從這里開始。

因為x + 1的結果是一個int所以需要將其轉換回一個(帶signedchar 這是通過整數轉換來完成的,當值不能適合較小的類型(例如嘗試將128存儲在一個有signed char )時,則從較大的有符號的類型(如int )轉換為較小的有符號的類型(如signed char )來完成。行為是實現定義的

在實踐中發生的是該值變為負數 (該值從0x7f增大到0x80 ,即2的補碼-128 (最常見的負數編碼))。 這進一步導致x 永遠小於225從而導致無限循環。

帶符號的char范圍是-128到127。 無符號字符范圍是0到255。如果x變量定義為無符號字符,則while循環將按預期工作。

如果使用帶符號的char定義變量,則變量'x'介於-128到127之間。它始終小於255。

  • char具有一個字節的大小,這意味着要編碼的256個可能值。
  • signed表示該值可以是negatif或positif,在C標准中,聲明為signed chard的變量的范圍是-127127
  • unsigned表示僅是正值,這導致聲明為unsigned char變量的范圍為0255

為了更好地理解這一點,讓我們研究這個示例unsigned char x =-1 ,問題是x的值是多少? 答案是x在機器中不是-1,因為編譯器會將x截斷為char類型的正值,因此x將為255 ,如果我們有unsigned char x = -2則x egale為254,依此類推。 這個例子對理解編譯器如何在后台解釋事物以及我們在代碼執行過程中得到什么結果的重要性。

無符號char的簡單含義是:在執行算術運算時,使用最高有效位代替將其視為+/-符號的位標志。

例如,如果將char用作數字,則意義重大:

typedef char BYTE1; typedef unsigned char BYTE2;

BYTE1 a; BYTE2 b; 對於變量a,僅7位可用,其范圍為(-127至127)=(+/-)2 ^ 7 -1。 對於變量b,所有8位均可用,范圍為0到255(2 ^ 8 -1)。

如果將char用作字符,則從程序中刪除注釋時,編譯器將完全忽略“ unsigned”。

Char是一種數據類型,在C編程中用於存儲字母和標點符號之類的字符。 但是,它仍然是整數類型。 這是由於char類型在技術上存儲整數而不是字符的原因。 它使用通過整數來表示字符的數字代碼。將char轉換為int值是由C自動完成的。但是,它仍然取決於確定結果是否為負的機器。 大寫字母A等於65的整數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM