1. 程式人生 > >關於c語言三位八進位制數越界的探討

關於c語言三位八進位制數越界的探討

1:\ddd;我們知道,\ddd是對用三位八進位制數轉義表示任意字元的形象化描述,但對d的取值限定在0-7之間,那麼我們不禁要問,如果超過了這個範圍會輸出些什麼,隨機數?開始我也是這麼覺得的,後來用vc6.0除錯知兩次輸出同一個越界轉義字元得到的是同一個字元,所以覺得有必要深究一下:

(1)  \ddd代表著一個位元組大小的整數值字元,一個位元組八位即'\201',‘\’跟後數字不能超過4,否則出錯,與編譯器有關,要麼截斷,要麼編譯錯誤,VC6.0中報錯),八進位制轉義字元中,而三位的八進位制有9位(每一位八進位制相當於3位二進位制),所以說'\ddd'表示的範圍已經超出了一個位元組的表示範圍,然而這會發生什麼

\001' 000 000 00'\401' 100 000 001

而一個字元只有8位,轉義字元'\001''\401'都有9位,於是我們情不自禁的就想到“截斷”。如果真是截斷,那麼'\001''\401'所表示的字元的值就是一樣的,捨棄了最高位的情況下,所以輸出都是1,列印內容一樣。而十六進位制轉義字元兩位十六進位制剛好對應8位二進位制,表示一個字元的範圍,所以不會出現上述問題。

(2)轉義字元是有符號的字元,關於這個問題只需將最高位,即8位置1,觀察打印出來的數是否為正數就可以得到答案,     printf("%d\t",'\201');輸出-127,可證.

2 越界探討

從某種意義上來說'\008'已不再是表示一個字元了,而是一個整數。其次

'\008'的整數值為56,很顯然讀的是字元’8’ASCII碼中的整數值56。而不是像“合法”情況下那樣,直接讀取的該整數值。所以這裡面有一個更深層次也更隱晦的問題,就是'\008'中的8不再表示3位二進位制,而是表示8位二進位制。因為系統將8作為一個字元’8’來處理了。那8之前的兩個0怎麼辦呢,由於系統讀取到0尚未識別到該轉義字元非法,所以0依舊是按八進位制“000”儲存,只不過在給8分配一個整位元組後再給第一個0的“000”左補符號位(這裡是0),給第二個0統一右補0;那麼我們不禁又要問,如果‘\080會如何,答案是,第一個0同上,第二個0(ASCII碼值48)換成8位二進位制“0011 0000”,這裡可能出現了數字不是以整位元組儲存的,但實際就是這樣

實驗:  printf("%d\t",'\108');會輸出什麼呢?

1          0001

0          0000

8(ASCII值56) 0011 1000

所以最終‘\108’在記憶體中儲存形式為  0001 0000 0011 1000 十進位制為 2104

      printf(“%d\t”,’\080’);   0    0000

                           8(ASCII值56) 0011 1000

                           0(ASCII值48)  0011 0000

所以最終’\080’儲存形式為     0000 0011 1000 0011 0000 十進位制為14384

作者 中南大學通訊1602肖濤

相關推薦

關於c語言越界探討

1:\ddd;我們知道,\ddd是對用三位八進位制數轉義表示任意字元的形象化描述,但對d的取值限定在0-7之間,那麼我們不禁要問,如果超過了這個範圍會輸出些什麼,隨機數?開始我也是這麼覺得的,後來用v

C語言棧的實現轉換

棧是限定僅在表尾進行操作的線性表。因此,對棧來說,表尾端有其特殊含義,成為棧頂,相應地,表頭端稱為棧底。 下面用C實現棧的基本操作以及利用棧來實現一個進位制轉換程式 #include <

c語言double十六輸出

printf("%x\n", ch);  其中%x  表示無符號十六進位制的整數, 多長取決你的編譯系統,而非ch的型別,會將ch轉成無符號十六進位制的整數輸出。  如果想按多長整數輸出前面再加  h | l | ll | I | I32 | I64 , printf("%hx\n", ch); h(shor

C語言中個各個的表示方法

八進位制怎麼表示?  用0開頭(零) 十六進位制怎麼表示? 用0x開頭(零x) NOTE: 八進位制和十六進位制轉換為2進位制好轉,只要把每一位按8421BCD碼轉換為2進位制就可以了。 八進位制和十六進位制轉換為2進位制,按權展開和就可以了。 十進位制轉換為R進位制,除

C語言——十進位制轉為二進位制、、十六的函式轉換

/*** * Copyright(C) 2011, SKYCNC * All rights reserved * * 程式名稱:dec_to_bin_oct_hex * 功    能:輸入一個十進位制數,將其轉化為二進位制、八進位制、十六進位制 * * 作    者:zhanghbboy * 完成日期:1

C語言將十進位制整數輸出為和十六

方法一: 直接使用控制字串 %o 八進位制 %x %X 十六進位制 方法二: 函式 char *itoa(int value, char *string, int radix)    返回值型別

十進位制轉二進位制、、十六C語言指標實現)

以下程式碼可以實現十進位制到二進位制、八進位制、十六進位制的任意轉換。 #include<stdio.h> #include<string.h> void fun10_2_8_16(char *p,int number,int cet) { if(number

C++ printf列印二進位制,,十六等(利用itoa)

printf是格式化輸出函式,它可以直接列印十進位制,八進位制,十六進位制,輸出控制符分別為%d, %o, %x, 但是它不存在二進位制,如果輸出二進位制可以呼叫stdlib.h裡面的itoa函式。

C語言 十進位制轉化為二進位制 十六

    對於剛開始學習C語言的來說,我們知道%d可以表示十進位制的數,%o可以表示八進位制的數,%x用來表示十六進位制的數,但卻沒有來表示二進位制數的。    這就是相對應的八進位制數和十六進位制數#include <stdio.h> int main() {

[計算機程式設計C++] 輸入整數顯示十六

12 輸入整數顯示十六進位制和八進位制(10分) 題目內容: 編寫程式,輸入整數,顯示其十進位制、十六進位制和八進位制形式。如輸入31,輸出: -31 -1f -37 輸入:一個整數,注意,可能是負數。 輸出:三個數,十進位制、十六進位制和八進位制,用空格隔開。 提示

C++入門篇——輸入一個整數並將這個整數分別以,十進位制,十六輸出;同時輸入一個布林值並且以布林值的方式打印出來

C++入門篇 輸入一個整數並將這個整數分別以 八進位制,十進位制,十六進位制輸出; 同時輸入一個布林值並且以 布林值的方式打印出來 注意:執行的時候需要按 ctrl鍵+F5 如果想只按F5就執行,在return 0;前面加一段程式碼: system("pause"); 同時需要

C++遞迴實現十進位制轉二進位制、、十六

1.轉二進位制與八進位制分析 我們最熟悉不過的就是短除法將十進位制轉二進位制,將餘數倒著輸出便是該是十進位制的二進位制數,那麼很容易想到拿十進位制數n%2(或者8)這樣可以得到最高位的二進位制(八

C# 基礎(四)C# 十進位制、二進位制、、十六

一、轉換 //十進位制轉二進位制 Console.WriteLine(Convert.ToString(69, 2)); //十進位制轉八進位制 Console.WriteLine(Convert.ToString(69, 8)); //十進位制轉十六進位制 Console

BASIC-12 基礎練習 十六c++)兩種解法,轉換2或10

 基礎練習 十六進位制轉八進位制   時間限制:1.0s   記憶體限制:512.0MB        錦囊1 使用二進位制。 錦囊2 先把十六進位制轉成二進位制,每位十六進位制正好

c++ 十六,十進位制 的 輸入

在預設的情況下,系統約定輸入的整型數是十進位制資料。當要求按八進位制或十六進位制輸入資料時,在cin中必須指明相應的資料型別:hex為十六進位制;oct為八進位制;dec為十進位制。 int  i,j

C++ 輸入輸出、十進位制、十六

預設進位制 cin or cout在預設情況下按照十進位制輸入輸出 八進位制 要使輸入為八進位制數,首先切換至八進位制輸入 cin >> oct; //接下里就可以輸入八進位制數了 cin >> a; // a 是八進位制數 十六進位制 要使輸入為十六進位制數,首先切換至十

C# 數值字串轉換成ASCII 字串相互轉換

      註冊一個外國的網站,註冊驗證的資訊為八進位制數值的字串形式,需要解碼一下才能知道驗證的問題。因此寫了一個小工具來轉換。如下: 八進位制數值字串:形式如: 127 150 157 040 144 145 166 145 154 157 160 145 144 040 164 150 145

js任意轉換(二進位制,,十進位制...十六

進位制轉換隻能發生在數字上,也就是Number型別,所以要進行進位制轉換,那就是需要用到Number型別上的方法了,有兩種方法: parseInt(string , radix)或者parseInt(string , radix),前者是全域性的方法,是以前的

C/C++中的轉義字元 (普通轉義字元、轉移字元及十六轉義字元)

從表中可以看出,在C語言中有三種轉義字元,它們是:一般轉義字元、八進位制轉義字元和十六進位制轉義字元。 1. 一般轉義字元 這種轉義字元,雖然在形式上由兩個字元組成,但只代表一個字元。常用的一般轉義字元為: \a  \n  \t  \v  \b  \r  \f  \

Python: 二進位制、、十六轉換或者輸出

為了將整數轉換為二進位制、八進位制或十六進位制的文字串,可以分別使用bin() ,oct() 或hex() 函式: >>> x = 1234 >>> bin(x) '0b10011010010' >>> oct(x) '0o2322' >&g