關於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'已不再是表示一個字元了,而是一個整數。其次
實驗: 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